PHP: What if I call a static method in non-static way

后端 未结 3 600
北恋
北恋 2020-12-03 13:43

I\'m not pro in Object Oriented Programming and I got a silly question:

class test {
    public static function doSomething($arg) {
        $foo = \'I ate yo         


        
相关标签:
3条回答
  • 2020-12-03 14:03

    It is better you call it this way to avoid E_STRICT on some version of PHP

    $bar = test::doSomething('Sandwich');
    

    FROM PHP DOC

    Static properties cannot be accessed through the object using the arrow operator ->. Calling non-static methods statically generates an E_STRICT level warning.

    Also

    Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as static can not be accessed with an instantiated class object (though a static method can).

    0 讨论(0)
  • 2020-12-03 14:07

    As Baba already pointed out, it results in an E_STRICT depending on your configuration.

    But even if that's no problem for you, I think it's worth mentioning some of the pitfalls which may result from calling static methods in a non-static way.

    If you have a class hierarchy like

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

    This produces the following output:

    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
    

    As you can see, it's easy to achieve unexpected behaviour when mixing static and non-static method calls and techniques.

    Therefore, my advice also is: Use Class::method to explicitly call the static method you mean to call. Or even better don't use static methods at all because they make your code untestable.

    0 讨论(0)
  • 2020-12-03 14:21

    It makes no difference if your method don't use $this and don't access to static properties.

    Static properties cannot be accessed through the object using the arrow operator ->.

    $this is not available inside the method declared as static.

    But, you should always use :: to call a static method, even through php let you call it on an instance.

    0 讨论(0)
提交回复
热议问题