相关疑难解决方法(0)

PHP子类Magic __isset有效,但__get没有

我有一个抽象的父类Mongo_Document(来自mongodb-php-odm)和一个继承的类Model_ActionPlan. Mongo_Document具有与Mongo_Document类内部数组交互的magic __isset和__get方法.

我试图使用以下代码(从方法内部的代码片段Model_ActionPlan):

if (isset($this->status))
{
    if (($this->status === "closed") AND ($this->close_type != "failure"))
    {
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意,close_type如果是,则保证设置status == 'closed'.)

isset调用返回true,然后继续执行下一条语句.在那里,我收到以下错误:

 Undefined property: Model_ActionPlan::$status
Run Code Online (Sandbox Code Playgroud)

但是,如果我替换$this->statusparent::__get('status'),则此代码按预期工作.请注意,在程序的其他任何地方,我都可以使用:

$ap = new Model_ActionPlan($plan_id);
echo $ap->status;
// Prints 'closed' (or 'active') as expected
Run Code Online (Sandbox Code Playgroud)

只有在这里,在课堂内部,这不起作用.

我环顾四周,似乎无法找到任何说明在子类中无法调用魔法的方法.我可以使用该parent::__get调用,但我认为这可能是错误的方法.有谁知道是否有正确/更好的方法来做到这一点?

更新了#1 2012-12-16: 父类的完整代码在Github上.

更新了#2 2012-12-18: 对于询问设置在何处或是否设置正确的人,答案是,由于调用parent::__get('status') 确实有效,问题显然不是变量没有设置.它__get()是从一个名为的私有instace变量中获取数据的 …

php inheritance magic-methods mongodb-php

25
推荐指数
1
解决办法
1627
查看次数

PHP - Zend说避免魔术方法?

我正在阅读这个页面 - http://deaduseful.com/blog/posts/50-php-optimisation-tips-revisited

其中一个建议是避免使用Zend Performance PDF引用的Magic Methods,它没有给出建议避免它们的理由.

经过一些谷歌搜索(并在这里结束一个不相关的问题),我想知道是否有人在这方面有任何推荐?

我在我的代码中使用了__get(),通常用于保存我并不总是使用的变量,例如

我可能有一个名为desc,category_id,time_added的表

我得到的东西会是这样的:

public function __get($name) {
    switch($name) {
        case 'name':
        case 'desc':
        case 'category':
        case 'time_added':
            $result = do_mysql_query();
            $this->name = $result['name'];
            $this->desc = $result['desc'];
            $this->category = $result['category'];
            $this->time_added = $result['time_added'];
            return $this->{$name};
        break;
        default:
            throw Exception("Attempted to access non existant or private property - ".$name);
    }
}

这似乎是一种很好的做事方式,因为我只需要从数据库中获取一些东西,如果需要的话,我可以为$ article-> time_added而不是摆弄数组.

这会被视为不良做法和服务器上的额外负载吗?

通常我会使用魔术方法扩展类,如果子类与get中的某些东西不匹配,则执行类似的操作.

public function __get($name) {
    switch($name) {
        case 'name':
        case 'desc':
        case 'category':
        case …

php performance magic-methods

10
推荐指数
1
解决办法
4853
查看次数

PHP继承的父方法无法访问子属性的私有属性

首先:一个非常相似的问题已经发布并且已经以某种方式解决了,但仍然没有回答我的具体问题.稍后会详细介绍.

用语言:我有一个基类,它为所有子项提供一些方法,但不包含任何属性.我的孩子继承了这些方法,这些方法应该用于访问孩子的属性.如果孩子的属性是protected或者public,一切正常,但是如果孩子的属性是private,则它会失败而没有错误(没有任何反应).

在代码中:

class MyBaseClass {
    public function __set($name, $value) {
        if(!property_exists($this, $name))
            throw new Exception("Property '$name' does not exist!");
        $this->$name = $value;
    }
}

class ChildClass extends MyBaseClass {
    public $publicProperty;
    protected $protectedProperty;
    private $privateProperty;
}

$myChild = new ChildClass();
$myChild->publicProperty = 'hello world';    //works of course!
$myChild->protectedProperty = 'hello world'; //works as expected
$myChild->privateProperty = 'hello world';   //doesn't work?
Run Code Online (Sandbox Code Playgroud)

上面提到的类似问题得到了使用魔术__set()方法访问私有属性的解决方案,但我已经在做了.如果我__set()在孩子中实现,它当然有效,但想法是,孩子继承了__set()它的父母,但显然它无法访问孩子的私人方法.

这是故意的吗?我做错了吗?或者我的方法只是废话设计?

背景: 我最初的想法是:整个动态的东西 …

php oop inheritance visibility

10
推荐指数
1
解决办法
1万
查看次数