Apr
03
2020
php中的后期静态绑定
使用的保留关键字:
static
定义:
static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。
self与static的区别:
self调用的就是本身代码片段这个类,而static调用的是从堆内存中提取出来,访问的是当前实例化的那个类(即static作用于当前调用的类)
示例一(在静态环境下)
输出结果是"B"
static
定义:
static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。
self与static的区别:
self调用的就是本身代码片段这个类,而static调用的是从堆内存中提取出来,访问的是当前实例化的那个类(即static作用于当前调用的类)
示例一(在静态环境下)
<?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 后期静态绑定从这里开始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?>
输出结果是"B"
class IoC { protected static $registry = []; public static function bind($name, Callable $resolver) { static::$registry[$name] = $resolver; } public static function make($name) { if (isset(static::$registry[$name])) { $resolver = static::$registry[$name]; return $resolver(); } throw new Exception('Alias does not exist in the IoC registry.'); } } IoC::bind('bim', function () { return new Bim(); }); IoC::bind('bar', function () { return new Bar(IoC::make('bim')); }); IoC::bind('foo', function () { return new Foo(IoC::make('bar')); }); // 从容器中取得Foo $foo = IoC::make('foo'); $foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething
发表评论: