2

说我有课

class person {
    public static function get_pk(){
        return self::$primary_key;
    }
}

和一个扩展类

class user extends person {
    protected $primary_key = 'id';
}

我想跑:

echo user::get_pk(); // should echo id

每当我运行它时,它自然会失败,因为 $primary_key 不是静态变量。如何让它返回主键?

是的,我可以更改类结构、函数结构并使其成为非静态的,但出于所有意图和目的,假设我们唯一可以更改的是静态函数 get_pk 的内容

4

3 回答 3

1

您不能从static方法访问非静态属性,因为要创建属性,需要实例化类。您可以自省该类以获取其定义的值:

public static function get_pk() {
    $class = new ReflectionClass(get_called_class());
    $props = $class->getDefaultProperties();
    return $props['primary_key'];
}

但实际上,这非常混乱,我不建议将其用于生产用途。正确地构造你的类要么是要么static不是static

于 2012-12-06T17:52:21.127 回答
1

我可以看到完成此操作的唯一方法是在父类中声明 $primary_key 变量,然后在子类定义范围之外为其分配一个值。(注意,我添加了abstract运算符来指示类是静态的,并且将类名的第一个字母大写以遵循约定。)

<?

abstract class Person {
    public static $primary_key;
    public static function get_pk() {
        return self::$primary_key;
    }
}

abstract class User extends Person {
}

User::$primary_key = 'id';
echo User::get_pk();

/* End of file */

更新

Aram,如果您希望 $primary_key 保持非静态,那么该方法将需要是非静态的,并且根据静态关键字手册,“伪变量 $this 在声明为静态的方法中不可用” 。

或者,您可以将代码转换为使用实例化的类对象:

<?

class Person {
    public function get_pk() {
        return $this->primary_key;
    }
}

class User extends Person {
    protected $primary_key = 'id';
}

$user = new User();
echo $user->get_pk();

/* End of file */
于 2012-12-06T18:15:31.107 回答
0

静态变量/方法与类相关,即不需要创建对象。您的primary_key变量是为每个对象创建的。所以静态方法无法访问它,因为静态方法没有特定对象的概念,因此对primary_key. 静态方法没有定义变量$this(因此self)。

我想您最好的选择是查看静态关键字。

于 2012-12-06T17:52:07.233 回答