延迟静态绑定

延迟静态绑定

  PHP的继承模型中有个存在已久的问题,那就是在父类中引用扩展类的最终状态比较困难.

class ParentBase{
    static $property = ‘Parent Value‘;
    public static function render(){
        return self::$property;
    }
}

class Descendant extends ParentBase{
    static $property = ‘Descendant Value‘;
}

echo Descendant::render();

//结果 Parent Value

  上例中,render()方法中使用了self关键字,这是指ParentBase类而不是指Descendant类.在ParentBase::render()方法中没法访问$property的最终值.为了解决这个问题,需要在子类中重写render()方法.

  通过引入延迟静态绑定功能,可以使用static作用域关键字访问类的属性或者方法的最终值.

使用静态作用域:

class ParentBase{
    static $property = ‘Parent Value‘;
    public static function render(){
        return static::$property;
    }
}

class Descendant extends ParentBase{
    static $property = ‘Descendant Value‘;
}

echo Descendant::render();

//Descendant Value

  通过使用静态作用域,可以强制PHP在最终的类中查找所有属性的值.除了这个延迟绑定行为,PHP还添加了get_called_class()函数,这允许检查继承的方法是从哪个派生类调用的.

class ParentBase{
    public static function render(){
        return get_called_class();
    }
}

class Descendant extends ParentBase{
}

echo Descendant::render();

//Descendant
时间: 2024-10-13 06:59:55

延迟静态绑定的相关文章

PHP延迟静态绑定:static关键字

PHP5.3中引入了延迟静态绑定的概念.该特性最明显的标志就是新关键字static.static类似于self,但它指的是被调用的类而不是包含类.在本例中,它的意思是调用Document::create()将生成一个新的Document对象,而不是试图实例化一个DomainObject对象. 因此,现在在静态上下文中使用继承关系. abstract class DomainObject{ public static function create(){ return new static();

PHP Static延迟静态绑定

初识PHP Static延迟静态绑定 PHP5.3以后引入了延迟静态绑定static,它是为了解决什么问题呢?php的继承模型中有一个存在已久的问题,那就是在父类中引用扩展类的最终状态比较困难.来看一个例子. PHP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class A { public static function echoClass(){ echo __CLASS__; } public static function tes

PHP延迟静态绑定 static关键字

示例代码1 abstract class Parent { } class Man extends Parent { public static function create(){ return new Man(); } } class Woman extends Parent { public static function create(){ return new Woman(); } } 示例代码有一个parent父类,还包含Man和Woman两个子类,并在该两个类中都包含创建本身的的静

“延迟静态绑定”的使用

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 <?php class ParentBase { static $property = 'Parent Value'; public static function render() { return self::$property; } } class Descendant extends P

PHP延迟静态绑定(本文属于转发)

这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来: <?php class DBHandler { function get() {} } class MySQLHandler extends DBHandler { // 这里一个create public static function create() { echo "MySQL"; return new self(); } public function get() { echo "MyS

PHP延迟静态绑定

php5.3已经开始支持延迟静态绑定. 延迟静态绑定指的是在父类中获取子类的最终状态.在父类中,如果出现self关键字,被子类继承后,这个self值的还是父类而不是子类. 如果在父类中出现了self关键字,并且子类继承了含有self的这段代码,那么需要考虑静态延迟绑定.在父类中使用static代替self 如下例: <?php class A{ public static $a=1; public function test(){ echo self::$a;//自身的属性a } } class

php Late Static Bindings延迟静态绑定

官网说道: As of PHP 5.3.0, PHP implements a feature called late static bindings which can be used to reference the called class in a context of static inheritance. More precisely, late static bindings work by storing the class named in the last "non-forw

PHP &quot;延迟静态绑定&quot; 功能,static

从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法.第二点延迟绑定,这个根据下面代码就可以很好的理解 看一下这个例子: class A{ static $name = "Tom"; public function printName(){ echo self::$name."\n"; self::fun(); } static function fun(){ echo "A Class\n"; } } cla

1.2魔术方法和延迟静态绑定

一.魔术方法: 1.__get,__set __get:获取一个不可访问的属性时触发(不可访问指属性不存在,或者没有访问权限) __set:为一个不可访问的属性赋值的时候触发 2.__isset,__unset __isset:当用isset()函数判断一个不可访问的属性时触发 __unset:当用unset()函数操作一个不可访问的属性时触发 3.__call,__callStatic __call:当调用一个不可访问的方法时触发 __callStatic:当调用一个不可访问的静态方法时触发