新自我与新静态

发布于 2024-10-20 15:04:21 字数 226 浏览 9 评论 0原文

我正在将 PHP 5.3 库转换为在 PHP 5.2 上工作。阻碍我的主要问题是使用后期静态绑定,例如 return new static($options); ,如果我将其转换为 return new self($options)我会得到相同的结果吗?

new selfnew static 之间有什么区别?

I am converting a PHP 5.3 library to work on PHP 5.2. The main thing standing in my way is the use of late static binding like return new static($options); , if I convert this to return new self($options) will I get the same results?

What is the difference between new self and new static?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

新人笑 2024-10-27 15:04:22

我会得到相同的结果吗?

并不真地。不过,我不知道 PHP 5.2 的解决方法。

new selfnew static 有什么区别?

self 指的是实际写入 new 关键字的同一个类。

static,在 PHP 5.3 的最新静态绑定中,指的是层次结构中您调用该方法的任何类。

在以下示例中,B 继承了 A 的两个方法。 self 调用绑定到 A,因为它是在 A 第一个方法的实现中定义的,而 static绑定到被调用的类(另请参阅 get_ Called_class())。

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

will I get the same results?

Not really. I don't know of a workaround for PHP 5.2, though.

What is the difference between new self and new static?

self refers to the same class in which the new keyword is actually written.

static, in PHP 5.3's late static bindings, refers to whatever class in the hierarchy you called the method on.

In the following example, B inherits both methods from A. The self invocation is bound to A because it's defined in A's implementation of the first method, whereas static is bound to the called class (also see get_called_class()).

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
护你周全 2024-10-27 15:04:22

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

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()));

结果:

string(1) "B"
string(1) "B"

If the method of this code is not static, you can get a work-around in 5.2 by using get_class($this).

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()));

The results:

string(1) "B"
string(1) "B"
帝王念 2024-10-27 15:04:22

除了其他人的答案:

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

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

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

class Foo {
    public $name = static::class;

}

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

使用 self::

class Foo {
    public $name = self::class;

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

请注意,我所做的代码中的致命错误注释并不表明错误发生的位置,错误发生在对象实例化之前,如注释中提到的@Grapestain

In addition to others' answers :

static:: will be computed using runtime information.

That means you can't use static:: in a class property because properties values :

Must be able to be evaluated at compile time and must not depend on run-time information.

class Foo {
    public $name = static::class;

}

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

Using self::

class Foo {
    public $name = self::class;

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

Please note that the Fatal error comment in the code i made doesn't indicate where the error happened, the error happened earlier before the object was instantiated as @Grapestain mentioned in the comments

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文