【问题标题】:Having trouble detecting 'return false'无法检测到“返回错误”
【发布时间】:2014-04-16 00:13:25
【问题描述】:

我有一个可以返回 FALSE 的 PHP 类。

由于某种奇怪的原因,我无法检测到 FALSE 返回。 我可以毫无问题地检测任何其他返回值。

简化版....

error_reporting(E_ALL);
ini_set("display_errors", 1);

$run = new myClass();//class returns false
$response = $run->myMethod();

我已经测试了以下...

!$response
!isset($response)
empty($response)
$response == false
$response === false

对于我熟悉的任何情况,我都无法得到任何类型的反应。

如果我将返回值设置为 1 或除 false 之外的任何值,$response 将包含类返回的任何值。 这不像是我的第一天。 (这是我的第二次)。

我使用 return false;经常,直到今天从未遇到过任何麻烦。

当然,我可以通过返回 'wtf' 之类的内容并测试该条件来解决此问题,但我真的很想弄清楚我在这里缺少什么。

感谢您的任何想法。

【问题讨论】:

  • 您是否对响应变量进行了 var_dump 以准确查看它返回的内容?这不是火箭科学……
  • 执行 gettype($response) 会得到什么?
  • var_dump($response) 将回答您的问题。从构造函数返回对象以外的任何东西都不是一个好主意...
  • var_dump() && gettype() 返回完全相同的东西......什么都没有。浏览器窗口中没有任何类型的可见数据。

标签: php


【解决方案1】:

当你为你的类创建一个实例时,它总是会返回一个对象而不是构造的返回。

<?php
class SomeClass
{
    // construct function that will always return false
    public function __construct()
    {
        return false;
    }
}

class TestClass extends PHPUnit_Framework_TestCase
{
    public function testReturn()
    {
         // check if this code returns false
         $this->assertFalse(new SomeClass);
    }

    public function testAssert()
    {
        // Checks if the object return is actually of SomeClass
        $this->assertInstanceOf('SomeClass', new SomeClass);
    }

    public function testReturnOfConstruct()
    {
        //checks the return of the construct
        $object = new SomeClass;
        $this->assertFalse($object->__construct());
    }
}

phpunit 的返回

phpunit --debug test3.php
PHPUnit 3.7.28 by Sebastian Bergmann.


Starting test 'TestClass::testReturn'.
F
Starting test 'TestClass::testAssert'.
.
Starting test 'TestClass::testReturnOfConstruct'.
.

Time: 7 ms, Memory: 5.25Mb

There was 1 failure:

1) TestClass::testReturn
Failed asserting that SomeClass Object () is false.

/var/www/test3.php:14

FAILURES!
Tests: 3, Assertions: 3, Failures: 1.

【讨论】:

  • 您可能想进一步解释一下它的作用。对于这个答案,基于 PHPUnit 的代码可能有点高级。不过,很好的示范。 :)
【解决方案2】:

您是否尝试从 public function __construct()public function MyClass()* 中返回 false?这将不起作用,因为new MyClass() 调用将触发 PHP 错误,或返回 MyClass 的实例,该实例永远不会评估为 false,因为它是对象的实例,因此不是 false。

如果您的类不需要实例化即可运行,您可以创建一个静态方法来执行您尝试运行的逻辑,如下所示:

<?php

class MyClass
{
    const COLOUR_BLUE = 'blue';

    public static function isSkyBlue()
    {
        if (isset($_POST['sky']) && $_POST['sky'] == self::COLOUR_BLUE) {
            return true;
        } else {
            return false;
        }
    }
}

// Call doThings() statically to get its value
$response = MyClass::isSkyBlue();
if ($response === false) {
    // Your logic goes here
}

或者,如果您在构造函数执行其逻辑之前将其传递给它,您可以执行以下操作:

<?php

class MyClass
{
    const COLOUR_BLUE = 'blue';

    protected $otherObject = null;

    public function __construct($otherObject)
    {
        $this->otherObject = $otherObject;
    }

    public function isSkyBlue()
    {
        if ($this->otherObject->sky == self::COLOUR_BLUE) {
            return true;
        } else {
            return false;
        }
    }
}

// Call doThings() statically to get its value
$response = new MyClass($otherObject)
if ($response->isSkyBlue() === false) {
    // Your logic goes here
}

* 请注意,您的构造函数应始终称为__construct(),因为自 PHP 5 起已不推荐使用构造函数的类名。

【讨论】:

  • 我调用的方法不是构造函数。这只是一个公共功能。我正在做你所展示的。返回 X 否则返回 false;
  • $response = new MyClass(); 只会实例化该类。然后你需要调用类上的方法来得到你的实际响应,例如:$myClass = new MyClass(); $response = $myClass-&gt;myMethod();
  • TWW。编辑了我的问题。对不起。接得好。但是是的......我正在实例化类并调用类中的方法。
  • 你能提供实际的代码吗?我的猜测是逻辑中的其他地方有错误。
  • 这是一个我用了一段时间的类。就像你上面的例子一样。 if ($this->otherObject->sky == self::COLOUR_BLUE) { return true; } else { return false;//检测不到return 1;//能检测到return 0;//能检测到return 'wtf';//能检测到}
【解决方案3】:

如果你使用的是构造函数,它不会返回任何东西......这不是一个正常的函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2011-11-29
    • 2022-06-30
    • 2013-02-23
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多