【问题标题】:Calling protected properties without using $this->在不使用 $this-> 的情况下调用受保护的属性
【发布时间】:2016-09-08 18:26:08
【问题描述】:

我正在阅读一本关于在 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 开发人员,我认为,他们在类中声明的几乎所有其他方法中都犯了同样的错误 (?)。

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

【问题讨论】:

  • 查看本书的网站,看看是否有勘误表。我很确定如果不使用$this,就无法访​​问属性。对于来自 C++ 的人来说,这是一个常见的错误。
  • 在属性和方法名称前加上下划线是区分私有属性/方法与公共属性/方法的一种约定(没有下划线)。知道这是哪本书会很有趣
  • 你确定你复制的函数正确吗?我想知道为什么这个函数会被命名为getClassMethods(),但它返回的是$_properties而不是$_methods
  • 这本书得到的大多是负面评论,尽管没有人提到代码有这么多错误。 Apress 网站有一个地址,您可以在其中提交勘误表,如果您觉得受到启发。
  • 你对这本书的看法可能是对的(它有点糟糕)。这很令人沮丧,因为理解 MVC 并构建 MVC 框架似乎真的很好:/

标签: php oop properties


【解决方案1】:

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

要访问protected $_methods 属性,您需要使用$this->_methods。这在类的任何方法中都可用。

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

因此,这本书是不正确的,在您的方法中需要使用$this->_methods$this->_properties

【讨论】:

  • 那么if(isset($_methods)) 怎么可能是真的,因为它是一个从未设置过的局部变量?如果它会消失,那么在循环中分配给它有什么意义呢?
  • return $_properties 返回什么,因为它也是一个局部变量,但从未在函数中设置?
  • @Barmar:让我试着改写我的答案。我只是想解释使用$this-> 和不使用它的区别。 isset始终false,因为在这种情况下您需要使用$this->
  • 感谢您的回答。但是,为什么会有if 语句来检查变量是否不存在(我们不知道该变量在函数中不存在)。另外,为什么变量的名称以下划线(_)字符开头,我以为这个字符是用来声明受保护/私有属性和方法的?
  • 正如 JimL 上面问的,这是什么书?如果他们有很多这样的代码,似乎他们只是不太了解 PHP,也没有聘请好的审阅者。
猜你喜欢
  • 2013-10-23
  • 2012-09-08
  • 2020-02-11
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多