Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung der Unterschiede zwischen den beiden überladenen Versionen in PHP

Ausführliche Erklärung der Unterschiede zwischen den beiden überladenen Versionen in PHP

伊谢尔伦
伊谢尔伦Original
2017-06-30 10:23:351266Durchsuche

„Überladung“ ist eine Implementierung des Polymorphismus einer Klasse. Funktionsüberladung bedeutet, dass ein Bezeichner als mehrfacher Funktionsname verwendet wird und diese Funktionen mit demselben Namen durch die Parameternummer oder den Parametertyp der Funktion unterschieden werden können, sodass es beim Aufruf nicht zu Verwirrung kommt . Der Hauptvorteil davon besteht darin, dass Sie nicht mehrere Funktionen für unterschiedliche Parametertypen oder Parameteranzahlen schreiben müssen.

Mehrere Funktionen verwenden denselben Namen, aber die Parameterliste, dh die Anzahl der Parameter oder (und) Datentyp, kann beim Aufruf unterschiedlich sein, obwohl der Methodenname der ist Ebenso wird die Parameterliste entsprechend den Parametern geändert. Die Tabelle kann automatisch die entsprechende Funktion aufrufen.

PHP4 implementiert nur einige der einfachen Funktionen von objektorientiert, aber die Unterstützung für Objekte wird in PHP5 viel leistungsfähiger sein.

Für die polymorphe Implementierung unterstützt PHP4 nur Override, aber keine Überladung. Aber wir können einige Tricks anwenden, um die Implementierung der Überladung zu „simulieren“.

Obwohl PHP5 Überschreiben und Überladen unterstützen kann, unterscheidet sich die spezifische Implementierung der Überladung erheblich von anderen Sprachen.

1, Überladung in PHP4 „simulieren“

Versuchen Sie den folgenden Code:

<?php 
//根据参数个数选择执行不同的方法(在 PHP4 中模拟"重载"(多态的一种) 
class Myclass 
{ 
function Myclass() 
{ 
$method = "method" . func_num_args(); 
$this->$method(); 
} 
function method1($x) 
{ 
echo "method1"; 
} 
function method2($x, $y) 
{ 
echo &#39;method2&#39;; 
} 
} 
//通过在类中的额外的处理,使用这个类对用户是透明的: 
$obj1 = new Myclass(&#39;A&#39;); //将调用 method1 
$obj2 = new Myclass(&#39;B&#39;,&#39;C&#39;); //将调用 method2 
?>

Verwenden Sie im obigen Code den Konstruktor, um die Anzahl der Parameter abzurufen und die Methode Methode1 oder Methode2 automatisch auszuführen. Wir können das obige Beispiel verbessern, indem wir die Funktionen func_get_arg(i) und func_get_args() kombinieren.
2, Überladung in PHP5 verwenden

Sehen Sie sich zuerst die folgenden Beispiele an:

<?php 
class Myclass 
{ 
public $attriable; 
public $one = "this is one"; 
public $two = "this is two"; 
function construct() 
{ 
} 
function one($one) 
{ 
$this->one=$one; 
$this->attriable = $this->one; 
} 
function one($one, $two) 
{ 
$this->one=$one; 
$this->two=$two; 
$this->attriable = $this->one . $this->two; 
} 
function display() 
{ 
echo $this->attriable; 
} 
} 
$one = "this is my class"; 
$two = "Im the best"; 
$myclass = new myclass(); 
$myclass->one($one); 
$myclass->display(); 
$myclass->one($one, $two); 
$myclass->display(); 
//本例的做法,在 PHP 中是不正确的! 
?>

Habe Überladung in C++, Java, C# verwendet Personen sind es gewohnt, PHP-Code zu schreiben, der die oben genannte Überladung implementiert. Dies gilt jedoch nicht für PHP5. PHP5 ist keine Nachahmung der oben genannten Sprachen, sondern verfügt über einen eigenen Satz von Methoden zur Implementierung von
Methodenüberladung (ob es gut oder schlecht ist, wird hier nicht diskutiert). Obwohl die Klassen von PHP5 viel leistungsfähiger sind als die von PHP4, wurde das Problem der „Überladung“ nicht wie erwartet „verbessert“. „Überladung“ kann durch verschiedene Parametertypen in „stark“ typisierten Sprachen wie C++, Java, C# usw. erreicht werden. In Sprachen, in denen „feste Parameter“ übergeben werden, kann auch die Anzahl der Parameter übergeben werden, wie z. B. Java, aber PHP ist eine schwach typisierte Sprache, sodass es nicht zu einer „Überladung“ wie oben kommt.
Überladen in PHP5 kann durch mehrere spezielle Methoden durchgeführt werden: get, set und call. PHP ruft diese Methoden auf, wenn die Zend-Engine versucht, auf ein Mitglied zuzugreifen und es nicht finden kann.

Im folgenden Beispiel ersetzen get und set alle Zugriffe auf das Attributvariablen-Array. Bei Bedarf können Sie auch jede gewünschte Filterart implementieren. Beispielsweise kann ein Skript das Festlegen von Eigenschaftswerten deaktivieren, mit einem bestimmten Präfix beginnen oder einen bestimmten Werttyp einschließen. Die Aufrufmethode veranschaulicht, wie Sie eine undefinierte Methode aufrufen können. Wenn Sie eine undefinierte Methode aufrufen, werden der Methodenname und die von der Methode empfangenen Parameter an die aufrufende Methode übergeben und PHP gibt den Aufrufwert an die undefinierte Methode zurück.


<?php 
class Overloader 
{ 
private $properties = array(); 
function get($property_name) 
{ 
if(isset($this->properties[$property_name])) 
{ 
return($this->properties[$property_name]); 
} 
else 
{ 
return(NULL); 
} 
} 
function set($property_name, $value) 
{ 
$this->properties[$property_name] = $value; 
} 
public function call($method, $p) 
{ 
print("Invoking $method()<br>\n"); 
//print("Arguments: "); 
//print_r($args); 
if($method == &#39;display&#39;) 
{ 
if(is_object($p[0])) 
$this->displayObject($p[0]); 
else 
if(is_array($p[0])) 
$this->displayArray($p[0]); 
else 
$this->displayScalar($p[0]); 
} 
} 
public function displayObject($p) 
{ 
echo ("你传入的是个对象,内容如下:<br>"); 
print_r($p); 
echo "<hr>"; 
} 
public function displayArray($p) 
{ 
echo ("你传入的是个数组,内容如下:<br>"); 
print_r($p); 
echo "<hr>"; 
} 
public function displayScalar($p) 
{ 
echo ("你传入的是个单独变量,内容如下:<br>" . $p); 
echo "<hr>"; 
} 
} 
$o = new Overloader(); 
//调用 set() 给一个不存在的属性变量赋值 
$o->dynaProp = "Dynamic Content"; 
//调用 get() 
print($o->dynaProp . "<br>\n"); 
//调用 call() 
//$o->dynaMethod("Leon", "Zeev"); 
$o->display(array(1,2,3)); 
$o->display(&#39;Cat&#39;); 
?>

Im obigen Code wird die display()-Methode aufgerufen, und das entsprechende Codesegment in der Klasse kann entsprechend der Art und Anzahl der Parameter aufgerufen werden , wodurch die Überladung der Objektmethode realisiert wird.

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung der Unterschiede zwischen den beiden überladenen Versionen 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