Heim  >  Artikel  >  Backend-Entwicklung  >  Vererbungsanalyse von Konstruktoren in PHP

Vererbungsanalyse von Konstruktoren in PHP

黄舟
黄舟Original
2017-07-02 10:02:051624Durchsuche

KonstruktorVerwendung

HP 5 ermöglicht Entwicklern, eine Methode als Konstruktor in einer Klasse zu definieren. Klassen mit einem Konstruktor rufen diese Methode jedes Mal auf, wenn ein neues Objekt erstellt wird. Daher eignet sie sich sehr gut für einige Initialisierungsarbeiten vor der Verwendung des Objekts.

Hinweis: Wenn ein Konstruktor in einer Unterklasse definiert ist, wird der Konstruktor seiner übergeordneten Klasse nicht implizit aufgerufen. Um den Konstruktor der übergeordneten Klasse auszuführen, müssen Sie parent::construct() im Konstruktor der untergeordneten Klasse aufrufen. Wenn die Unterklasse keinen Konstruktor definiert, wird sie wie eine gewöhnliche Klassenmethode von der übergeordneten Klasse geerbt (sofern sie nicht als privat definiert ist).
Beispiel #1 Verwendung des neuen Standardkonstruktors

<?php
class BaseClass {
   function construct() {
       print "In BaseClass constructorn";
   }
}
class SubClass extends BaseClass {
   function construct() {
       parent::construct();
       print "In SubClass constructorn";
   }
}
class OtherSubClass extends BaseClass {
    // inherits BaseClass&#39;s constructor
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>

Wenn PHP 5 aus Gründen der Abwärtskompatibilität die Funktion „construct()“ in der Klasse nicht finden kann und keine von der übergeordneten Klasse erbt, wird es es versuchen um einen Konstruktor im alten Stil zu finden, bei dem es sich um eine Funktion mit demselben Namen wie die Klasse handelt. Ein Kompatibilitätsproblem tritt also nur dann auf, wenn die Klasse bereits über eine Methode namens construction() verfügt, diese aber für andere Zwecke verwendet wird.

Im Gegensatz zu anderen Methoden generiert PHP keine E_STRICT-Fehlermeldung, wenn construction() von einer Methode mit anderen Parametern als der übergeordneten Klasse construction() überschrieben wird.

Seit PHP 5.3.3 ist im Namespace die Methode mit demselben Namen wie der Klassenname kein Konstruktor mehr. Diese Änderung wirkt sich nicht auf Klassen aus, die sich nicht im Namespace befinden.

Beispiel #2 Konstruktoren in Namespace-Klassen

<?php
namespace Foo;
class Bar {
    public function Bar() {
        // treated as constructor in PHP 5.3.0-5.3.2
        // treated as regular method as of PHP 5.3.3
    }
}
?>

Weisen Sie beim Erstellen von Objekten Anfangswerte zu.

1. //创建一个人类  
2.  
3. 0class Person   
4. 0{   
5. //下面是人的成员属性   
6. var $name;       //人的名子   
7. var $sex;        //人的性别   
8. var $age;        //人的年龄   
9. //定义一个构造方法参数为姓名$name、性别$sex和年龄$age   
10. function construct($name, $sex, $age)   
11. {   
12. //通过构造方法传进来的$name给成员属性$this->name赋初使值   
13. $this->name=$name;   
14. //通过构造方法传进来的$sex给成员属性$this->sex赋初使值   
15. $this->sex=$sex;   
16. //通过构造方法传进来的$age给成员属性$this->age赋初使值   
17. $this->age=$age;   
18. }   
19. //这个人的说话方法   
20. function say()   
21. {  
22. echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";   
23. }   
24. }   
25. //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄  
26. $p1=new Person("张三","男", 20);   
27. $p2=new Person("李四","女", 30);   
28. $p3=new Person("王五","男", 40);   
29. //下面访问$p1对象中的说话方法   
30. $p1->say();   
31. //下面访问$p2对象中的说话方法   
32. $p2->say();   
33. //下面访问$p3对象中的说话方法   
34. $p3->say();

Das Ausgabeergebnis ist:

Mein Name ist: Zhang San Geschlecht: Männlich Mein Alter ist: 20
Mein Name ist: Li Si Geschlecht: Weiblich Mein Alter ist: 30
Mein Name ist: Wang Wu Geschlecht: männlich Mein Alter ist: 40

Konstruktor-Vererbungsproblem

Sehen wir uns zunächst ein einfaches Beispiel an:

<?php
class Fruit {
public function construct($name)
{
echo &#39;水果&#39;.$name.&#39;创建了&#39;;
}
}
 
class Apple extends Fruit {
public function construct($name)
{
parent::construct($name);
}
}
 
$apple = new Apple("苹果");
 
// 输出 水果苹果创建了
?>

Die Konstruktorvererbung erspart das Umschreiben des Codes, nicht die Methodendeklaration. Das heißt, der in der übergeordneten Klasse deklarierte Konstruktor muss in der Tat erneut deklariert werden, was ebenfalls ein Umschreibungsprozess ist.

Die Konstruktorvererbung von PHP muss die folgenden Bedingungen erfüllen:

Wenn die übergeordnete Klasse eine Konstruktordeklaration hat, muss die Unterklasse auch eine Deklaration haben, andernfalls tritt ein Fehler auf.
Beim Ausführen des Konstruktors der übergeordneten Klasse muss das übergeordnete Schlüsselwort in der untergeordneten Klasse in Anführungszeichen gesetzt werden.
Wenn die übergeordnete Klasse einen Konstruktor hat und die untergeordnete Klasse keinen Konstruktor hat, wird der Konstruktor der übergeordneten Klasse tatsächlich ausgeführt, wenn die untergeordnete Klasse instanziiert wird. Angenommen, die Employee-Klasse hat den folgenden Konstruktor:

function  construct($name){
$this->setName($name);
}
然后实例化CEO类,获得其name成员:

$ceo= new CEO("Gonn");
echo $ceo->getName();
将得到如下结果:

My name is Gonn

Wenn die Unterklasse jedoch auch einen Konstruktor hat, wird die Unterklasse unabhängig davon instanziiert, ob die übergeordnete Klasse vorhanden ist hat einen Konstruktor. Der eigene Konstruktor der Unterklasse wird ausgeführt. Nehmen wir beispielsweise an, dass die CEO-Klasse zusätzlich zu der Employee-Klasse, die den oben genannten Konstruktor enthält, auch den folgenden Konstruktor enthält:

function  construct(){
echo "CEO object created!";
}

Instanziieren Sie die CEO-Klasse erneut und führen Sie getName() auf die gleiche Weise aus Mal erhalten Sie eine andere Ausgabe:


CEO-Objekt erstellt!

Mein Name ist Gonn
Wenn Sie auf parent::construct() stoßen, beginnt PHP, entlang des übergeordneten Elements nach oben zu suchen Klasse für eine geeignete Konstruktfunktion. Da es in Executive nicht gefunden wurde, haben wir weiter nach der Employee-Klasse gesucht und hier den passenden Konstruktor gefunden. Wenn PHP einen Konstruktor in der Employee-Klasse findet, führt es den Konstruktor aus. Wenn Sie sowohl den Employee-Konstruktor als auch den Executive-Konstruktor ausführen möchten, müssen Sie parent::construct() im Executive-Konstruktor aufrufen.

Außerdem können Sie eine andere Möglichkeit wählen, um auf den Konstruktor der übergeordneten Klasse zu verweisen. Nehmen wir beispielsweise an, dass beim Erstellen eines neuen CEO-Objekts sowohl der Employee- als auch der Executive-Konstruktor ausgeführt werden. Wie oben erwähnt, können diese Konstruktoren im Konstruktor des CEO wie folgt explizit referenziert werden:

function construct($name){
Employee::constrcut($name);
Executive::construct();
echo "CEO object created!";
}

Konstruktorvererbung in verschiedenen PHP-Versionen

Referenzen in Konstruktoren


Der Konstruktorname von PHP 4.x ist derselbe wie der Klassenname.
Der Konstruktorname der Unterklasse ist derselbe wie der Unterklassenname (Unsinn).
Der Konstruktor der übergeordneten Klasse wird in der Unterklasse nicht automatisch ausgeführt.
Um den Konstruktor der übergeordneten Klasse in der Unterklasse auszuführen, müssen Sie eine Anweisung ähnlich der folgenden ausführen:
$this->[Konstruktorname der übergeordneten Klasse ()]

Für Beispiel:

class base1
{
  function base1()
  {
echo &#39;this is base1 construct&#39;;
  }
}
class class1 extends base1
{
  function class1()
  {
$this->base1();
echo &#39;this is class1 construct&#39;;
  }
}
$c1 = new class1;

PHP5.x-Version:

PHP5.0 und höhere Versionen haben die Funktionen von Klassen erheblich erweitert. Der Konstruktor einer Klasse trägt den einheitlichen Namen „construct()“.
Der Konstruktorname der Unterklasse lautet ebenfalls construction() (ebenfalls Unsinn).
Ob der Konstruktor der übergeordneten Klasse in der Unterklasse ausgeführt wird, gibt es zwei Situationen:
1. Wenn die Unterklasse den Konstruktor Konstrukt() nicht definiert, wird standardmäßig der Konstruktor der übergeordneten Klasse geerbt . Und es wird automatisch ausgeführt.
2. Wenn die Unterklasse den Konstruktor Konstrukt () definiert, überschreibt der Konstruktor der Unterklasse tatsächlich den Konstruktor der übergeordneten Klasse, da der Name des Konstruktors auch Konstrukt () ist. Zu diesem Zeitpunkt wird der Konstruktor der Unterklasse ausgeführt.
Wenn Sie zu diesem Zeitpunkt den Konstruktor der übergeordneten Klasse in der Unterklasse ausführen möchten, müssen Sie eine Anweisung ähnlich der folgenden ausführen:

parent::construct();

Zum Beispiel:

class base2
{
  function construct()
  {
echo &#39;this is base2 construct&#39;;
  }
  function destruct()
  {
  }
}
class class2 extends base2
{
  function construct()
  {
parent::construct();
echo &#39;this is class2 construct&#39;;
  }
}

注意 parent::construct(); 语句不一定必须放在子类的构造函数中。放在子类的构造函数中仅仅保证了其在子类被实例化时自动执行。

PHP4.0 和 5.0 类构造函数的兼容问题:

在 PHP5.0 以上版本里,还兼容了 4.0 版本的构造函数的定义规则。如果同时定义了4.0的构造函数和 construct()函数,则construct() 函数优先。
为了使类代码同时兼容 PHP4.0 和 5.0,可以采取以下的方式:

class class3
{
  function construct() //for PHP5.0
  {
echo &#39;this is class2 construct&#39;;
  }
  function class3() //for PHP4.0
  {
$this->construct();
  }
}
$c3 = new class3;

php构造函数中的引用的内容。

<?php
class Foo {
   function Foo($name) {
     
       global $globalref;
       $globalref[] = &$this;
  
       $this->setName($name);
      
       $this->echoName();
   }
   function echoName() {
       echo "<br />",$this->name;
   }
   function setName($name) {
       $this->name = $name;
   }
}
?>

下面来检查一下用拷贝运算符 = 创建的 $bar1 和用引用运算符 =& 创建的 $bar2 有没有区别...
copy to clipboard
显然没有区别,但实际上有一个非常重要的区别:$bar1 和 $globalref[0] 并没有被引用,它们不是同一个变量。这是因为“new”默认并不返回引用,而返回一个拷贝。

<?php
$bar1 = new Foo(&#39;set in constructor&#39;);
$bar1->echoName();
$globalref[0]->echoName();
/* &#36755;&#20986;&#65306;
set in constructor
set in constructor
set in constructor */
$bar2 =& new Foo(&#39;set in constructor&#39;);
$bar2->echoName();
$globalref[1]->echoName();
/* &#36755;&#20986;&#65306;
set in constructor
set in constructor
set in constructor */
?>

Das obige ist der detaillierte Inhalt vonVererbungsanalyse von Konstruktoren in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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