New self vs. new static

前端 未结 3 457
伪装坚强ぢ
伪装坚强ぢ 2020-11-22 10:04

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

相关标签:
3条回答
  • 2020-11-22 10:34

    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"
    
    0 讨论(0)
  • 2020-11-22 10:40

    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

    0 讨论(0)
  • 2020-11-22 11:00

    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
    
    0 讨论(0)
提交回复
热议问题