首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新自我与新静态

新自我与新静态
EN

Stack Overflow用户
提问于 2011-03-05 01:41:47
回答 3查看 232.4K关注 0票数 549

我正在转换一个PHP 5.3库,以便在PHP 5.2上工作。阻碍我的主要事情是使用像return new static($options);这样的后期静态绑定,如果我将它转换成return new self($options),我会得到同样的结果吗?

new selfnew static之间的区别是什么

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-05 02:19:12

我会得到相同的结果吗?

不怎么有意思。不过,我不知道PHP5.2有什么变通方法。

new selfnew static的区别是什么?

self引用与实际编写new关键字的类相同的类。

在PHP5.3的后期静态绑定中,static指的是层次结构中调用该方法的任何类。

在下面的示例中,BA继承了这两个方法。self调用被绑定到A,因为它是在第一个方法的A实现中定义的,而static被绑定到被调用的类(也请参见get_called_class())。

代码语言:javascript
复制
class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
票数 975
EN

Stack Overflow用户

发布于 2012-07-11 15:13:35

如果此代码的方法不是静态的,您可以在5.2中使用get_class($this)来解决此问题。

代码语言:javascript
复制
class A {
    public function create1() {
        $class = get_class($this);
        return new $class();
    }
    public function create2() {
        return new static();
    }
}

class B extends A {

}

$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));

结果:

代码语言:javascript
复制
string(1) "B"
string(1) "B"
票数 26
EN

Stack Overflow用户

发布于 2018-08-24 17:07:05

除了别人的回答之外:

static::将使用运行时信息进行计算。

这意味着您不能在类属性中使用static::,因为属性值:

必须能够在编译时进行计算,并且不能依赖于运行时信息。

代码语言:javascript
复制
class Foo {
    public $name = static::class;

}

$Foo = new Foo;
echo $Foo->name; // Fatal error

使用self::

代码语言:javascript
复制
class Foo {
    public $name = self::class;

}
$Foo = new Foo;
echo $Foo->name; // Foo

请注意,我在代码中所做的致命错误注释并没有指出错误发生的位置,错误发生在对象被实例化之前,在注释

中提到的@grapeStain.

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5197300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档