【书评】对“延迟绑定”绑定的理解
时间: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
?>
在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章讲了延迟绑定 ivan820819 发表于 2009-7-22 16:48
作者: cnkiller 发布时间: 2009-08-06
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28