PHP中迟到的静态绑定究竟是什么?

PHP中迟到的静态绑定究竟是什么?


从PHP 5.3.0开始,PHP实现了一个叫做后期静态绑定的特性,它可以用来在静态继承的上下文中引用被调用的类。

晚期静态绑定试图通过引入引用最初在运行时调用的类的关键字来解决该限制。 决定不引入新的关键字,而是使用已经保留的static

我们来看一个例子:

<?php
    class Car
    {
        public static function run()
        {
            return static::getName();
        }

        private static function getName()
        {
            return 'Car';
        }
    }

    class Toyota extends Car
    {
        public static function getName()
        {
            return 'Toyota';
        }
    }

    echo Car::run(); // Output: Car
    echo Toyota::run(); // Output: Toyota
?>

late static bindings通过存储最后一个“非转发呼叫”中指定的类来工作。 在静态方法调用的情况下,这是明确命名的类(通常是::运算符左侧的那个); 在非静态方法调用的情况下,它是对象的类。

“转发呼叫”是由self::parent::static:: ,或者如果在类层次结构forward_static_call()继续引入的静态调用。

函数get_called_class()可用于检索具有被调用类名称的字符串,并且static::引入其作用域。


您肯定需要阅读PHP手册中的Late Static Bindings。 不过,我会尽力给你一个快速总结。

基本上,它归结为self关键字不遵循相同的继承规则的事实。 self总是会解决它所使用的类。 这意味着如果你在父类中创建一个方法并从一个子类调用它,那么self就不会像你期望的那样引用这个孩子。

延迟静态绑定为static关键字引入了新的用法,它解决了这个特定的缺点。 当你使用static ,它代表你第一次使用它的类,即。 它'绑定'到运行时类。

这是它背后的两个基本概念。 该办法selfparentstatic时操作static是在打法可以是细微的,因此而不是去到更多的细节,我强烈建议你学习手册页的例子。 一旦你了解了每个关键词的基础知识,这些例子就非常有必要了解你将得到什么样的结果。


没有非常明显的行为:

以下代码产生'alphabeta'。

class alpha {

    function classname(){
        return __CLASS__;
    }

    function selfname(){
        return self::classname();
    }

    function staticname(){
        return static::classname();
    }
}

class beta extends alpha {

    function classname(){
        return __CLASS__;
    }
}

$beta = new beta();
echo $beta->selfname(); // Output: alpha
echo $beta->staticname(); // Output: beta

但是,如果我们从beta类中删除了classname函数的声明,则会得到'alphaalpha'。

链接地址: http://www.djcxy.com/p/1751.html

上一篇: What exactly are late static bindings in PHP?

下一篇: What's the difference between :: (double colon) and