我不是面向对象编程的专家,我有一个愚蠢的问题:
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');
我已经测试过了,它工作正常,没有任何错误或通知等,但是这样做正确吗?
发布于 2012-10-14 00:48:10
正如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
正如您所看到的,当混合静态和非静态方法调用和技术时,很容易实现意想不到的行为。
因此,我的建议也是:使用类::方法显式地调用您想要调用的静态方法。或者更好的是,根本不要使用静态方法,因为它们会使您的代码无法测试。
发布于 2012-10-13 23:17:16
即使您的方法不使用$this
,也不访问静态属性,也没有区别。
无法使用箭头运算符->通过对象访问静态属性。
$this在声明为static的方法中不可用。
但是,你应该总是使用::
来调用静态方法,即使是通过php让你在实例上调用它。
https://stackoverflow.com/questions/12874376
复制相似问题