0

好的,所以我对 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);
4

3 回答 3

2

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

在课堂里:

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

课外:

var_dump($db->getDB());
于 2012-11-30T01:06:46.647 回答
0

它们可以是公共的、受保护的或私有的。

请参阅 php 手册以获取示例

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

于 2012-11-30T01:07:01.167 回答
0

下面,“项目”= 属性(类范围的变量)或方法,“访问”= 调用(方法)或直接使用/更改(属性)。

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

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

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

于 2012-11-30T01:23:16.533 回答