PHP对象可见性

时间:2012-11-30 01:04:28

标签: php visibility

好的,所以我对PHP很新,但这让我很烦恼。当我尝试转储var时,我得到一个“无法访问受保护的属性Database :: $ database”。为什么$ db对象无法访问$ database?在涉及对象时,我是否误解了“私有”,“受保护”和“公共”关键字?

class Database
{
    protected $database;

    function __construct()
    {
        $this->database = new PDO("mysql:host=localhost;dbname=myDB", "root", "password");
    }
}
$db = new Database();
var_dump($db->database);

3 个答案:

答案 0 :(得分:2)

您的受保护属性仅在类(和扩展类...)中可用,因此在类中的方法中您可以使用$this->database但在类之外,您需要一个getter来访问它的值,像:

在课堂上:

public function getDB()
{
  return $this->database;
}

课外:

var_dump($db->getDB());

答案 1 :(得分:0)

他们可以是公开的,受保护的或私人的。

请参阅php手册以获取示例

http://php.net/manual/en/language.oop5.visibility.php

答案 2 :(得分:0)

下面,“Item”= property(类范围变量)或方法,“visited”=调用(方法)或直接使用/更改(属性)。

  • 具有私有可见性的项目只能在定义它们的类中访问。 注意就我个人而言,我发现它只会导致使用私人的悲伤。相反,使用受保护的,以便人们可以扩展课程并使用该项目,除非您确实有充分的理由将其设为私有。
  • 具有受保护可见性的项目只能在定义它们的类中访问,以及任何扩展该类的类(即子类将继承它)
  • 可以在当前类,所有子类以及对象可用范围内访问具有 public 可见性的项目。 如果您没有指定可见性,这是​​默认设置,但为了清晰起见,这样做是好的。

要访问可用范围之外的私有或受保护属性,请使用公共getter / setter方法。

编辑:所以要回答你为什么会收到错误的问题,你在可用的类的受保护属性 上调用var_dump()。由于它受到保护,因此无法在全球范围内使用。你可以将var_dump()移动到类中的一个方法(并记住在从内部引用对象时使用$ this),或者你可以使用getter方法返回值,然后使用var_dump()。