检测'return false'时遇到问题

时间:2014-03-12 03:56:28

标签: php

我有一个可以返回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或ANYTHING而不是false,则$ response将包含类返回的内容。 这不是我的第一天。 (这是我的第二次)。

我使用return false;经常,直到今天都没有遇到任何麻烦。

当然,我可以通过返回类似'wtf'的东西并测试这个条件来解决这个问题,但我真的想弄清楚我在这里缺少什么。

感谢任何想法。

3 个答案:

答案 0 :(得分:2)

当你创建一个类的实例时,它将始终返回一个对象,而不是返回构造。

<?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.

答案 1 :(得分:1)

您是否尝试在public function __construct()public function MyClass() *内返回false?这不起作用,因为new MyClass()调用将触发PHP错误,或返回MyClass的实例,它永远不会评估为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起,不推荐使用构造函数的类名。

答案 2 :(得分:0)

如果您使用的是构造函数,它将不会返回任何内容......它不是正常的函数