gpt4 book ai didi

PHP:如果我以非静态方式调用静态方法怎么办

转载 作者:IT王子 更新时间:2023-10-28 23:58:08 26 4
gpt4 key购买 nike

我不是面向对象编程的专业人士,我有一个愚蠢的问题:

class test {
public static function doSomething($arg) {
$foo = 'I ate your ' . $arg;
return $foo;
}
}

所以调用doSomething()方法的正确方法是test::doSomething('Pizza');,对吗?

现在,如果我这样调用它会发生什么:

$test = new test;
$bar = $test->doSomething('Sandwich');

我已经对其进行了测试,它可以正常工作,没有任何错误或通知等,但是这样做是否正确?

最佳答案

正如 Baba 已经指出的那样,它会根据您的配置生成 E_STRICT

但即使这对您来说没问题,我认为也值得一提以非静态方式调用静态方法可能导致的一些陷阱。

如果你有这样的类层次结构

class A {
public static function sayHello() {
echo "Hello from A!\n";
}

public function sayHelloNonStaticWithSelf() {
return self::sayHello();
}

public function sayHelloNonStaticWithStatic() {
return static::sayHello();
}
}

class B extends A {
public static function sayHello() {
echo "Hello from B!\n";
}

public function callHelloInMultipleDifferentWays() {
A::sayHello();
B::sayHello();
$this->sayHelloNonStaticWithSelf();
$this->sayHelloNonStaticWithStatic();
$this->sayHello();
}
}

$b = new B();
$b->callHelloInMultipleDifferentWays();

这会产生以下输出:

Hello from A!
// A::sayHello() - obvious

Hello from B!
// B::sayHello() - obvious

Hello from A!
// $this->sayHelloNonStaticWithSelf()
// self alweays refers to the class it is used in

Hello from B!
// $this->sayHelloNonStaticWithStatic()
// static always refers to the class it is called from at runtime

Hello from B!
// $this->sayHello() - obvious

如您所见,混合静态和非静态方法调用和技术时很容易实现意外行为。

因此,我的建议也是:使用 Class::method 显式调用您要调用的静态方法。或者最好根本不要使用静态方法,因为它们使您的代码无法测试

关于PHP:如果我以非静态方式调用静态方法怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12874376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com