首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP:如果我以非静态的方式调用静态方法怎么办

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

Stack Overflow用户
提问于 2012-10-13 23:10:06
回答 2查看 7.9K关注 0票数 26

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

代码语言:javascript
复制
class test {
    public static function doSomething($arg) {
        $foo = 'I ate your ' . $arg;
        return $foo;
    }
}

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

现在,如果我这样称呼它,会发生什么:

代码语言:javascript
复制
$test = new test;
$bar = $test->doSomething('Sandwich');

我已经测试过了,它工作正常,没有任何错误或通知等,但是这样做正确吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-14 00:48:10

正如Baba已经指出的,它会根据您的配置产生一个E_STRICT

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

如果您有一个类层次结构,如

代码语言:javascript
复制
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();

这将生成以下输出:

代码语言:javascript
复制
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

正如您所看到的,当混合静态和非静态方法调用和技术时,很容易实现意想不到的行为。

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

票数 17
EN

Stack Overflow用户

发布于 2012-10-13 23:17:16

即使您的方法不使用$this,也不访问静态属性,也没有区别。

无法使用箭头运算符->通过对象访问静态属性。

$this在声明为static的方法中不可用。

但是,你应该总是使用::来调用静态方法,即使是通过php让你在实例上调用它。

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

https://stackoverflow.com/questions/12874376

复制
相关文章

相似问题

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