Heim Backend-Entwicklung PHP-Tutorial Vererbungsanalyse von Konstruktoren in PHP

Vererbungsanalyse von Konstruktoren in PHP

Jul 02, 2017 am 10:02 AM
php 分析 继承

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();
?>
Nach dem Login kopieren

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
    }
}
?>
Nach dem Login kopieren

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();
Nach dem Login kopieren

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("苹果");
 
// 输出 水果苹果创建了
?>
Nach dem Login kopieren

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
Nach dem Login kopieren

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!";
}
Nach dem Login kopieren

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!";
}
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;;
  }
}
Nach dem Login kopieren

注意 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;
Nach dem Login kopieren

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;
   }
}
?>
Nach dem Login kopieren

下面来检查一下用拷贝运算符 = 创建的 $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 */
?>
Nach dem Login kopieren

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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

7 PHP-Funktionen, die ich leider vorher nicht kannte 7 PHP-Funktionen, die ich leider vorher nicht kannte Nov 13, 2024 am 09:42 AM

Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

See all articles