+ -
当前位置:首页 → 问答吧 → 【书评】对“延迟绑定”绑定的理解

【书评】对“延迟绑定”绑定的理解

时间:2009-07-22

来源:互联网

引言

在php6中将实现迟静态绑定(LSB),迟绑定是一种OO的特性,它甚至已经在php5中开始支持,此文将描述迟静态绑定是什么,这个问题是怎么样解决的 。

什么是“迟静态绑定”

目前 static引入到当前的类中,像self 或__CLASS__做为一个功能成员存在于Class当中,在这里它是这样定义的:

<?php

class A {

     public static function who() {

         echo __CLASS__;

     }

     public static function test() {

         self::who();

     }

}

class B extends A {

     public static function who() {

         echo __CLASS__;

     }

}

B::test(); // A

?>


“迟静态绑定”尝试解决这个问题,这关键字引入到Class中,它可以在类运行时调用最初的值,基本上,这关键字,让您可以参考在前面的例子当中B类的test() ,它决定不引入新的关键字,而是使用static已存在的保留(关键字)

<?php

class A {

     public static function who() {

         echo __CLASS__;

     }

     public static function test() {

        self::who();

     }

}

class B extends A {

     public static function who() {

         echo __CLASS__;

     }

}

B::test(); // A

?>

一些人把static::理解为$this->, static调用的协议(认为) 这是不正确的。如下继承的规则,而static::没有。

Examples

<?php

class TestClass {

   protected static function who() {

         echo __CLASS__."\n";

    }

    public static function test() {

        return self::who();

    }

}

class ChildClass1 extends TestClass {

    protected static function who() {

         echo __CLASS__."\n";

    }

}

class ChildClass2 extends TestClass {}

TestClass::test();   // TestClass

ChildClass1::test(); // TestClass

ChildClass2::test(); // TestClass

?>


它也可以被用在非静态方面:

<?php

class TestChild extends TestParent {

public function __construct() {

self::who();

}

public function test() {

$o = new TestParent();

}

public static function who() {

echo __CLASS__."\n";

}

}

class TestParent {

public function __construct() {

self::who();

}

public static function who() {

echo __CLASS__."\n";

}

}

$o = new TestChild; // TestChild

$o->test();

//TestParent

?>

完全解决静态调用,并没有降低或破坏”迟静态绑定“的协议

<?php

class A {

     public static function foo() {

         self::who();

     }

     public static function who() {

         echo __CLASS__."\n";

     }

}

class B extends A {

     public static function test() {

         A::foo();

     }

     public static function who() {

         echo __CLASS__."\n";

     }

}

B::test(); // A

?>


由于此方法是通用的,它只是没有破坏性的强迫性内部函数,这就意味着static::可以以相同的方式,可靠的存在于__get __set()……它们当中

<?php

class A {

protected static function who() {

echo __CLASS__."\n";

}

public function __get($var) {

return self::who();

}

}

class B extends A {

protected static function who() {

echo __CLASS__."\n";

}

}

$b = new B;

$b->foo; // A

?>


同样的原则也适用于处理(过程),只要它们已定义,并在有效范围调用

附:

<?php

class parentClass {

public function normalTest() {

$this->lsbSim('who');

}

public static function staticTest() {

// $this->lsbSim('who');

// self::lsbSim('who');

self::who(); // Outputs: parentClass

}

protected function lsbSim($func, array $args = array()) {

return call_user_func_array(array(get_class($this), $func), $args);

}

public static function who() {

echo __CLASS__;

}

}

class childClass extends parentClass {

public static function who() {

echo __CLASS__;

}

}

parentClass::staticTest();// Outputs: parentClass

$parentClass = new parentClass;

$parentClass->normalTest(); // Outputs: parentClass

$childClass = new childClass;

$childClass->normalTest(); // Outputs: childClass

?>

作者: 极品黑公子   发布时间: 2009-07-22

顶一下认真学习的好同学

作者: blankyao   发布时间: 2009-07-22

貌似样章讲的是文档和编码,呵呵!

作者: ivan820819   发布时间: 2009-07-22

貌似样章讲的是文档和编码,呵呵!
ivan820819 发表于 2009-7-22 16:48
第5章讲了延迟绑定

作者: cnkiller   发布时间: 2009-08-06