Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在设置对象的公共属性之前进行操作?_Php_Class_Oop - Fatal编程技术网

Php 如何在设置对象的公共属性之前进行操作?

Php 如何在设置对象的公共属性之前进行操作?,php,class,oop,Php,Class,Oop,如果我得到一个类似这样的类: class a { public $aa; public $ab; } $t = new a(); 现在,, 如果我键入$t->,我会在zend Studio下得到一个提示列表,但现在我需要执行以下操作: class a { public $aa; public $ab; public function __get( $name ){ $this->$name = x; return $

如果我得到一个类似这样的类:

class a {
    public $aa;
    public $ab;
}
$t = new a();
现在,, 如果我键入
$t->
,我会在zend Studio下得到一个提示列表,但现在我需要执行以下操作:

class a {
    public $aa;
    public $ab;
    public function __get( $name ){
        $this->$name = x;
        return $this->$name;
    }
}

那么,我该怎么办?首先,我仍然希望得到提示列表,并且只能列出公共属性。对此有何想法?

在我看来,这里有两个相互关联的问题

如果将公共字段添加到类中,则可以在自动完成建议中看到这些字段,这样编写代码就更容易了,但如果这样做,则不会执行_get,因为这是一个可见属性,并且只对不可见属性调用_get

如果删除公共字段(或将其设置为私有以使其不可见),则会执行u_get,但不会得到任何自动完成建议,因为没有可见字段。这样您的代码就可以工作了,但是由于没有自动完成的建议,编写代码就更难了

所以我给你的建议是完全忘记“获取”功能。假装它不存在(因为它不会做你想让它做的事情)。使用成员函数而不是公共属性,您将得到自动完成建议以及执行的代码。是的,你必须以这种方式实施更多的方法,但这就是生活,你不能总是拥有你想要的一切,你必须妥协


您可以使用Java书籍中的一些内容,为getter和setter定义方法(因此可以使用
function getName()
function setName($value)
,或者如果愿意,可以使用
function name($value=null)
并根据传入的值设置或获取)或者,如果您不关心惰性部分,您也可以在构造函数中分配这些值,您唯一要做的就是分配值。

由于$name可以是任何东西,Zend Studio无法真正建议所有可能性。。。另外,我真的建议你在类的顶部声明所有属性,比如$aa和$ab。也许可以使用更像$this->myVars[$name]这样的机制。Zend Studio也会将所有私有保护和公共属性放在代码建议列表中。使用getter,而不是magic方法。魔术方法实际上不可能按定义键入提示。谢谢你的回答,但很抱歉,我可能无法让你清楚地理解它,我的意思是,如果我让_get()工作,我无法公开所有属性,那么我就无法获得提示列表。所以,现在的问题是,我需要提示列表,还需要_get()方法工作。我读了phpdoc手册,除了它没有发现任何东西,所以我想,如果我能让_get()工作并公开所有属性,那就好了。有什么建议吗?@MicheallAuthor,我已经在我的答案中添加了更多的细节,以使我自己更清楚。希望能有所帮助,如果你认为我完全误解了你,请告诉我。我非常感谢你的回答。我认为函数名($value=null)最适合我,因为它更清晰、更简单。无论如何,再次感谢您。很高兴能为您提供帮助。:)