PHP 从静态方法访问对象的受保护属性

Posted

技术标签:

【中文标题】PHP 从静态方法访问对象的受保护属性【英文标题】:PHP accessing protected properties of an object from a static method 【发布时间】:2013-10-02 22:17:11 【问题描述】:

不确定这是否是一个问题。我对受保护/私有属性和方法的理解是它们只能从类中访问。我有一个静态方法,它是一种将对象保存到数据库的快速方法。我从静态方法中创建对象并通过 setter 函数设置属性。然而,一个属性没有设置器,但我仍然可以访问它。我有一个看起来像这样的类:

class Person 

   protected $name;
   protected $email;
   protected $created;

   //set name
   public function set_name( $name ) 
       $this->name = $name;
   

   //set email
   public function set_email( $email ) 
       $this->email = $email;
   

   //add new person
   static function add( $data ) 

       $person = new Person;
       $person->set_name( $data['name'] );
       $person->set_email( $data['email'] );

       //set created date
       $person->created = date('Y-m-d h:ia', time());

       //save to db
       $db->add($data);

       return $person;

   


实现看起来像这样:

$person = Person::add(array(
   'name' => 'Bob Barker',
   'email' => 'bob@thepriceisright.com'
));

此代码有效。通过作品,我的意思是创建的日期设置成功。为什么?

【问题讨论】:

你的add方法不就是另一种编写构造函数的方式吗? 当然。只是一种不同的方法。该类在整个应用程序中有更多用途,因此我选择将保存到数据库的方法分开。 【参考方案1】:

受保护的属性可以通过类中的代码进行修改,而不仅仅是从该类的实例中修改。

【讨论】:

即使方法是静态的?这似乎是一个错误。 如果您认为封装的意义在于对类的数据进行操作的所有逻辑都在类本身中,这是有道理的。静态方法仍然在类中定义,我们可以假设一个类知道如何操作它自己的实例。无论如何,这是我的看法。【参考方案2】:

因为您是在课堂上设置它。 setter 通常用于从类外部设置变量,例如 Person::set_name('Bob Barker')。但是如果你尝试过 Person->created = date(),它应该会失败。

【讨论】:

我同意。它应该失败。它不是。我可以在静态方法中成功地设置对象的 created 属性。 不,静态方法在类内部,所以它可以访问类中的变量。变量仅被保护不被从类的外部访问。我引用的 Person->created 将来自类实现之外,在 $person = Person::add(array(... line 好的。我误解了你。有道理。

以上是关于PHP 从静态方法访问对象的受保护属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个类的静态方法中访问类的受保护变量?

php静态方法

php中静态方法的使用

静态方法的受保护修饰符的目的是啥

为啥我不能访问静态多态派生类中的受保护成员?

PHP中的static的理解