【问题标题】:PHP Can static:: replace self::?PHP 可以用 static:: 代替 self:: 吗?
【发布时间】:2011-06-10 18:25:29
【问题描述】:

我对这件事有点困惑。我正在设计一个 ORM 类,该类的行为与 ruby​​ on rails 中的 ActiveRecord 非常相似,但这不是重点。

我想说的是,我的类广泛使用静态属性继承,特别是用于数据库和表处理。我的问题是,我应该使用 self:: 吗?

【问题讨论】:

  • 我认为 static 首先是错误的方法。听起来(如果错误,请更正)您刚刚使您的代码无法测试。

标签: php static-methods static-members


【解决方案1】:

您必须问自己:“我是否使用适当的方法来解决问题?”

self::static:: 做两件不同的事情。例如self::__CLASS__ 是对当前类的引用,因此在特定范围内定义它不足以满足转发静态调用的需要。

继承会发生什么?

class A {
    public static function className(){
        echo __CLASS__;
    }

    public static function test(){
        self::className();
    }
}

class B extends A{
    public static function className(){
        echo __CLASS__;
    }
}

B::test();

这将打印出来

A

另一方面,static:: 它具有预期的行为

class A {
    public static function className(){
        echo __CLASS__;
    }

    public static function test(){
        static::className();
    }
}

class B extends A{
    public static function className(){
        echo __CLASS__;
    }
}


B::test();

这将打印出来

B

这就是late static binding in PHP 5.3.0。它解决了调用在运行时引用的类的限制。

考虑到这一点,我认为您现在可以充分了解并解决问题。如果您继承了多个静态成员并且需要访问父成员和子成员 self:: 就不够了。

【讨论】:

  • 所以基本上如果我想让事情表现得像往常一样,就像在其他所有语言中一样,我应该使用 static 代替吗?然后当这些事情并不重要时,我不妨使用 self 来实现兼容性。对吗?
  • 没错,如果你想要向后兼容,你必须处理 self.如果您想以这种方式访问​​静态成员,则必须执行一个包装成员的静态方法。
  • 感谢和 +1。很有帮助
【解决方案2】:

尝试使用下面的代码来看看selfstatic的区别:

<?php
class Parent_{
    protected static $x = "parent";
    public static function makeTest(){
        echo "self => ".self::$x."<br>";
        echo "static => ".static::$x;       
    }
}

class Child_ extends Parent_{
    protected static $x = "child";
}

echo "<h4>using the Parent_ class</h4>";
Parent_::makeTest();

echo "<br><h4>using the Child_ class</h4>";
Child_::makeTest();
?>

你会得到这个结果:

使用 Parent_ 类

  • 自我 => 父母
  • 静态 => 父级

使用 Child_ 类

  • 自我 => 父母
  • 静态 => 孩子

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 2015-01-30
    • 2019-06-03
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多