Heim > Backend-Entwicklung > PHP-Tutorial > So erstellen Sie eine statische Bindung zwischen static:: und new static() in PHP

So erstellen Sie eine statische Bindung zwischen static:: und new static() in PHP

coldplay.xixi
Freigeben: 2023-04-08 18:36:02
nach vorne
2519 Leute haben es durchsucht

So erstellen Sie eine statische Bindung zwischen static:: und new static() in PHP

static::late statische Bindung mit neuem static() in PHP

1. self, $this, __CLASS__

class A {}
class B extends A{
parent::(public|protected)(静态方法|静态变量)  ===> parent永远是A
self::(public|protected)(静态方法|静态变量)  ===> self永远是B
$this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是B的是实例化对象
__CLASS__    ===> 永远是B
} 
class C extends B{
parent::(public|protected)(静态方法|静态变量)  ===> parent永远是B
self::(public|protected)(静态方法|静态变量)  ===> self永远是C
$this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是C的是实例化对象
__CLASS__    ===> 永远是C 
}
Nach dem Login kopieren

2. static::

Das static-Schlüsselwort kann die folgenden Funktionen erreichen:

1 Aufruf Statische Methoden einer Klasse haben einen späten statischen Bindungseffekt.

2 Der Aufruf statischer Eigenschaften einer Klasse hat einen späten statischen Bindungseffekt.

3 Der Aufruf nicht statischer Methoden einer Klasse hat keinen späten statischer Bindungseffekt ;

4 Hinweis: Nicht statische Eigenschaften können nicht aufgerufen werden;

class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
         $this->foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    private static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//A success!
Nach dem Login kopieren
class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
        static::foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    private static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//A无法调用C里的私有foo方法 
 
 
 
 
//将C的foo改成非private(public|protected)就可以解决
class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
        static::foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    public static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//C success!
Nach dem Login kopieren
class A {
 public static function foo() {
     static::who();
 }
 
 public static function who() {
     echo __CLASS__."\n";
 }
}
 
class B extends A {
 public static function test() {
     A::foo();
     parent::foo();
     self::foo();
 }
 
 public static function who() {
     echo __CLASS__."\n";
 }
}
class C extends B {
 public static function who() {
     echo __CLASS__."\n";
 } 
}
 
C::test(); 
A =>A::foo()的结果
C =>parent::foo()能走到A的foo,里面static::who找C::who
C =>self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who
 
 
 
 
 
class A {
    protected static function foo() {
        static::who();
    }
 
    protected static function who() {
        echo __CLASS__."\n";
    }
}
 
class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }
 
    protected static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    protected static function who() {
        echo __CLASS__."\n";
    } 
}
 
C::test(); //A C C,解释同上
 
 
 
 
 
class A {
 public static function foo() {
     static::who();
 }
 
 private static function who() {
     echo __CLASS__."\n";
 }
}
 
class B extends A {
 public static function test() {
     A::foo();
     parent::foo();
     // self::foo();  
 }
 
 private static function who() {
     echo __CLASS__."\n";
 }
}
class C extends B {
 private static function who() {
     echo __CLASS__."\n";
 } 
}
 
C::test();
//A =>A::foo()的结果 
//报错 A不可C的私有方法who => parent::foo()能走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
//报错 A不可C的私有方法who => self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
Nach dem Login kopieren

3. new static()

//new self()与new static()的区别,官网例子如下: 
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_static()); // A
Nach dem Login kopieren

Empfohlenes Tutorial: "PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo erstellen Sie eine statische Bindung zwischen static:: und new static() in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage