在不使用$ this->

时间:2016-05-12 18:42:55

标签: php oop properties

我正在阅读一本关于在PHP中创建MVC框架的书。在第二章中,我们构建了一个有点奇怪的类。让我用一个例子来解释。

该类名为Inspector。以下是属性:

protected $_class;
protected $_properties = array();
protected $_methods = array();

protected $_meta = array(
            "class" => array(),
            "properties" => array(),
            "methods" => array()
    );

正如您所看到的,它们都被声明为受保护的。

但是现在,这是该课程的众多方法之一:

public function getClassMethods()
{
    if (!isset($_methods))
    {
        $methods = $this->_getClassMethods();
        foreach ($methods as $method)
        {
            $_methods[] = $method->getName();
        }
    }
    return $_properties;
}

_getClassMethods()是一个在上面声明了几行的方法,但对我们的例子来说并不重要。

显然,$_methods是先前声明的属性。但是为什么它之前没有$this->?首先,我认为这是因为该属性被声明为protected,但我做了一些测试,看它是否正常并且正常工作,但当然它引发了一个错误。

我无法相信错误来自本书:我认为编写者是专业的PHP开发人员,他们在类中声明的所有其他方法中也犯了同样的错误(?)。 / p>

那么,PHP是否可以在不使用$this->的情况下调用属性?它是否与php.ini中的配置行(或类似的东西)有关?也许是因为它是使用过的旧版PHP。

1 个答案:

答案 0 :(得分:3)

在您的函数中,$_methods$this->_methods将是两个不同的变量/属性。

要访问protected $_methods媒体资源,您需要使用$this->_methods。这可以在班级的任何方法中使用。

如果你只使用$_methods,那么你正在创建/访问一个只存在于该方法中的变量,并在方法执行完毕后消失。

因此,本书不正确,您的需要 使用$this->_methods$this->_properties