php中static当实例化方法用是什么意思
迷茫
迷茫 2017-04-11 10:17:06
[PHP讨论组]

最近在看别人的一个源码时看到一个很奇怪的写法,不太明白是什么意思

    public static function request($method, $uri)
    {
        //主要是这边,为什么可以new 一个static,是魔术方法吗?还是其他的
        //如果是魔术方法,那它调用的是哪个方法呢?__callStatic?
        return new static($method, $uri);
    }
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
PHPz
使用场景
先来观察以下代码:
abstract class base {
  //do sth
}
class aClass extends base{
  public static function create(){
    return new aClass();
  } 
}
class bClass extends base{
  public static function create(){
    return new bClass();
  }
}
var_dump(aClass::create());
var_dump(bClass::create());
输出:
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
以上aClass和bClass继承于base这个抽象类,但是在两个子类中同时实现了create()这个静态方法。遵从oop思想,这种重复代码应该放在base这个父类中实现。
改进代码
abstract class base {
  public static function create(){
    return new self();
  } 
}
class aClass extends base{
}
class bClass extends base{
}
var_dump(aClass::create());
var_dump(bClass::create());
现在的代码看起来好像已经符合我们之前的想法,将create()方法放在父类里共用了,那我们来运行下看会发生什么。
Cannot instantiate abstract class base in ...
很遗憾,代码好像并没有按照我们预想的那样去运行,父类中的self()被解析为base这个父类,并非继承与他的子类。于是为了解决这个问题,php5.3中引入了延迟静态绑定这个概念。
延迟静态绑定
abstract class base {
  public static function create(){
    return new static();
  } 
}
class aClass extends base{
}
class bClass extends base{
}
var_dump(aClass::create());
var_dump(bClass::create());

这个代码与之前的几乎一致,不同点在于将self换成了static这个关键字,static会解析为子类,而非父类,这样就可以解决上面遇到的问题,这就是php的延迟静态绑定。
最后,运行一下代码,得到了最终想要的结果。
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
黄舟

new static 就是new 当前类,
这个跟静态延迟绑定有关,static是运行时的实例,讲起来比较拗口,看下代码吧,这里的static和你的问题的static是一个意思

class A {
   public function say() {
       echo '我是A::say';
   }
    
   public function callSay() {
       static::say();
   }
}

class B extends A {
    public function say() {
       echo '我是B::say';
   }
}

$m = new B();
$m->callSay();
// 输出 我是B::say

PHP静态延迟绑定官方文档

黄舟
<?php

class Father{
    public static function testStatic(){
        return new static();
    }
    public static function testSelf(){
        return new self();
    }
}
class Son extends Father{

}

echo get_class(Son::testStatic()).PHP_EOL;
echo get_class(Father::testStatic()).PHP_EOL;

echo get_class(Son::testSelf()).PHP_EOL;
echo get_class(Father::testSelf()).PHP_EOL;

看看这个代码运行结果
这个和php绑定有关系,这个查询下百度就OK了哈

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号