magiska metoder: Skillnad mellan sidversioner
Hoppa till navigering
Hoppa till sök
Admin (diskussion | bidrag) (Skapade sidan med 'Magic Methods ¶ Magic methods are special methods which override PHP's default's action when certain actions are performed on an object. Caution All methods names starting with __ are reserved by PHP. Therefore, it is not recommended to use such method names unless overriding PHP's behavior. The following method names are considered magical: __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __serializ...') |
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
||
Rad 1: | Rad 1: | ||
== Klassabstraktion ¶ == | |||
PHP har abstrakta klasser och metoder. Klasser som definieras som abstrakta kan inte instansieras, och alla klasser som innehåller minst en abstrakt metod måste också vara abstrakta. Metoder som definieras som abstrakta deklarerar endast metodens signatur; de kan inte definiera implementeringen. | |||
När en klass ärver från en abstrakt klass måste alla metoder som är markerade som abstrakta i föräldrarklassens deklaration definieras av barnklassen och följa de vanliga reglerna för arv och signaturkompatibilitet. | |||
=== Exempel #1 Abstrakt klassexempel === | |||
<pre> | |||
<?php | <?php | ||
class | abstract class AbstractClass | ||
{ | { | ||
protected | // Tvinga den ärvande klassen att definiera denna metod | ||
abstract protected function getValue(); | |||
abstract protected function prefixValue($prefix); | |||
public function | |||
// Gemensam metod | |||
$this-> | public function printOut() { | ||
print $this->getValue() . "\n"; | |||
} | } | ||
} | |||
class ConcreteClass1 extends AbstractClass | |||
class | |||
{ | { | ||
protected | protected function getValue() { | ||
return "ConcreteClass1"; | |||
} | } | ||
public function prefixValue($prefix) { | |||
return "{$prefix}ConcreteClass1"; | |||
$ | |||
} | } | ||
} | |||
class ConcreteClass2 extends AbstractClass | |||
{ | { | ||
public function getValue() { | |||
return "ConcreteClass2"; | |||
public function | |||
} | } | ||
public function | public function prefixValue($prefix) { | ||
return "{$prefix}ConcreteClass2"; | |||
return $ | |||
} | } | ||
} | } | ||
$ | $class1 = new ConcreteClass1; | ||
$class1->printOut(); | |||
echo $class1->prefixValue('FOO_') ."\n"; | |||
$class2 = new ConcreteClass2; | |||
$class2->printOut(); | |||
echo $class2->prefixValue('FOO_') ."\n"; | |||
$ | |||
?> | ?> | ||
</pre> | |||
Utdata från exemplet ovan: | |||
<pre> | |||
ConcreteClass1 | |||
FOO_ConcreteClass1 | |||
ConcreteClass2 | |||
FOO_ConcreteClass2 | |||
</pre> | |||
=== Exempel #2 Abstrakt klassexempel === | |||
<pre> | |||
<?php | <?php | ||
class | abstract class AbstractClass | ||
{ | { | ||
// Vår abstrakta metod behöver bara definiera de nödvändiga argumenten | |||
abstract protected function prefixName($name); | |||
} | } | ||
class ConcreteClass extends AbstractClass | |||
class | |||
{ | { | ||
public | // Vår barnklass kan definiera valfria argument som inte finns i föräldrarnas signatur | ||
public function prefixName($name, $separator = ".") { | |||
if ($name == "Pacman") { | |||
$ | $prefix = "Mr"; | ||
$ | } elseif ($name == "Pacwoman") { | ||
return $ | $prefix = "Mrs"; | ||
} else { | |||
$prefix = ""; | |||
} | |||
return "{$prefix}{$separator} {$name}"; | |||
} | } | ||
} | } | ||
$ | $class = new ConcreteClass; | ||
$ | echo $class->prefixName("Pacman"), "\n"; | ||
$ | echo $class->prefixName("Pacwoman"), "\n"; | ||
?> | ?> | ||
</pre> | |||
Utdata från exemplet ovan: | |||
<pre> | |||
Mr. Pacman | |||
Mrs. Pacwoman | |||
</pre> | |||
= Sidslut = | = Sidslut = | ||
Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.magic.php | Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.magic.php |
Versionen från 18 augusti 2024 kl. 19.21
Klassabstraktion ¶
PHP har abstrakta klasser och metoder. Klasser som definieras som abstrakta kan inte instansieras, och alla klasser som innehåller minst en abstrakt metod måste också vara abstrakta. Metoder som definieras som abstrakta deklarerar endast metodens signatur; de kan inte definiera implementeringen.
När en klass ärver från en abstrakt klass måste alla metoder som är markerade som abstrakta i föräldrarklassens deklaration definieras av barnklassen och följa de vanliga reglerna för arv och signaturkompatibilitet.
Exempel #1 Abstrakt klassexempel
<?php abstract class AbstractClass { // Tvinga den ärvande klassen att definiera denna metod abstract protected function getValue(); abstract protected function prefixValue($prefix); // Gemensam metod public function printOut() { print $this->getValue() . "\n"; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } class ConcreteClass2 extends AbstractClass { public function getValue() { return "ConcreteClass2"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2"; } } $class1 = new ConcreteClass1; $class1->printOut(); echo $class1->prefixValue('FOO_') ."\n"; $class2 = new ConcreteClass2; $class2->printOut(); echo $class2->prefixValue('FOO_') ."\n"; ?>
Utdata från exemplet ovan:
ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
Exempel #2 Abstrakt klassexempel
<?php abstract class AbstractClass { // Vår abstrakta metod behöver bara definiera de nödvändiga argumenten abstract protected function prefixName($name); } class ConcreteClass extends AbstractClass { // Vår barnklass kan definiera valfria argument som inte finns i föräldrarnas signatur public function prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr"; } elseif ($name == "Pacwoman") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; } } $class = new ConcreteClass; echo $class->prefixName("Pacman"), "\n"; echo $class->prefixName("Pacwoman"), "\n"; ?>
Utdata från exemplet ovan:
Mr. Pacman Mrs. Pacwoman
Sidslut
Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.magic.php
PHP
Språkreferens
Språkreferens#Klasser_och_Objekt