php面向对象的方法重载两种版本比较
多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
PHP4 中仅仅实现了面向对象的部分的、简单的功能,而 PHP5 以后对对象的支持就强大的多了。
对于多态的实现,PHP4 只支持覆盖(override),而不支持重载(overload)。但我们可以通过一些技巧来“模拟”重载的实现。
PHP5 虽然可以支持覆盖和重载,但重载在具体实现上,和其他语言还有较大的差别。
1,在 PHP4 中“模拟”重载
试看以下代码:
//根据参数个数选择执行不同的方法(在 PHP4 中模拟"重载"(多态的一种)
class Myclass
{
function Myclass()
{
$method = "method" . func_num_args();
$this->$method();
}
function method1($x)
{
echo "method1";
}
function method2($x, $y)
{
echo 'method2';
}
}
//通过在类中的额外的处理,使用这个类对用户是透明的:
$obj1 = new Myclass('A'); //将调用 method1
$obj2 = new Myclass('B','C'); //将调用 method2
?>
以上代码中,通过在构造函数中使用 func_num_args() 函数取到参数的个数,自动执行 method1 或 method2 方法。我们可以结合函数 func_get_arg(i) 和 func_get_args() 对以上示例进行改进。
2,在 PHP5 中使用重载
先看以下示例:
复制代码 代码如下:
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 中是不正确的!
?>
使用过 C++、Java、C# 重载的人,很习惯地就会写出以上的重载实现的 PHP 代码。但这在 PHP5 中是不正确的。PHP5 并不是对前述几种语言的模仿,而是有自己的一套实现方法重载的方法(是好是坏,这里不讨论)。 虽说 PHP5 的类较 PHP4 强大了许多,但是在“重载”这个问题上并没有像我们预期的那样“改善”。在“强”类型的语言中可以通过不同的参数类型来实现“重载”,比如C++、Java、C# 等。在“固定参数”传递的语言中,还可以通过参数的个数进行传递,比如 Java,但是 PHP 是弱类型语言,因此不会出现类似以上的“重载”。
PHP5 中重载可以通过 __get, __set, and __call 几个特殊方法来进行。当 Zend 引擎试图访问一个成员并没有找到时,PHP将会调用这些方法。
在以下示例中,__get和__set代替所有对属性变量数组的访问。如果必要,你还可以实现任何类型你想要的过滤。例如,脚本可以禁止设置属性值, 在开始时用一定的前缀或包含一定类型的值。__call 方法说明了你如何调用未经定义的方法。你调用未定义方法时,方法名和方法接收的参数将会传给__call方法, PHP传递__call的值返回给未定义的方法。
代码如下:
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()
\n");
//print("Arguments: ");
//print_r($args);
if($method == 'display')
{
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 ("你传入的是个对象,内容如下:
");
print_r($p);
echo "
";
}
public function displayArray($p)
{
echo ("你传入的是个数组,内容如下:
");
print_r($p);
echo "
";
}
public function displayScalar($p)
{
echo ("你传入的是个单独变量,内容如下:
" . $p);
echo "
";
}
}
$o = new Overloader();
//调用 __set() 给一个不存在的属性变量赋值
$o->dynaProp = "Dynamic Content";
//调用 __get()
print($o->dynaProp . "
\n");
//调用 __call()
//$o->dynaMethod("Leon", "Zeev");
$o->display(array(1,2,3));
$o->display('Cat');
?>
以上代码中,调用了 display() 方法,可以根据参数的类型和个数调用类中的对应的代码段,从而实现了对象方法的重载。
感谢您的阅读,想要更多的相关内容请关注PHP中文网(www.php.cn)!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara menggunakan bahasa Go untuk melaksanakan pengaturcaraan dipacu peristiwa berorientasikan objek Pengenalan: Paradigma pengaturcaraan berorientasikan objek digunakan secara meluas dalam pembangunan perisian, dan pengaturcaraan dipacu peristiwa ialah model pengaturcaraan biasa yang merealisasikan aliran program melalui pencetusan dan pemprosesan peristiwa. Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk melaksanakan pengaturcaraan dipacu peristiwa berorientasikan objek dan memberikan contoh kod. 1. Konsep pengaturcaraan dipacu peristiwa Pengaturcaraan dipacu acara ialah model pengaturcaraan berdasarkan peristiwa dan mesej, yang memindahkan kawalan aliran program kepada pencetus dan pemprosesan peristiwa. dalam acara didorong

Anotasi @JsonIdentityInfo digunakan apabila objek mempunyai hubungan ibu bapa-anak dalam perpustakaan Jackson. Anotasi @JsonIdentityInfo digunakan untuk menunjukkan identiti objek semasa bersiri dan penyahsirilan. ObjectIdGenerators.PropertyGenerator ialah kelas ruang letak abstrak yang digunakan untuk mewakili situasi di mana pengecam objek yang akan digunakan berasal daripada sifat POJO. Syntax@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

Menganalisis Corak Flyweight dalam Pengaturcaraan Berorientasikan Objek PHP Dalam pengaturcaraan berorientasikan objek, corak reka bentuk ialah kaedah reka bentuk perisian yang biasa digunakan, yang boleh meningkatkan kebolehbacaan, kebolehselenggaraan dan kebolehskalaan kod. Corak flyweight ialah salah satu corak reka bentuk yang mengurangkan overhed memori dengan berkongsi objek. Artikel ini akan meneroka cara menggunakan mod flyweight dalam PHP untuk meningkatkan prestasi program. Apakah mod flyweight? Corak flyweight ialah corak reka bentuk struktur yang tujuannya adalah untuk berkongsi objek yang sama antara objek yang berbeza.

Bahasa Go menyokong pengaturcaraan berorientasikan objek melalui definisi jenis dan perkaitan kaedah. Ia tidak menyokong warisan tradisional, tetapi dilaksanakan melalui gubahan. Antara muka menyediakan ketekalan antara jenis dan membenarkan kaedah abstrak ditakrifkan. Kes praktikal menunjukkan cara menggunakan OOP untuk mengurus maklumat pelanggan, termasuk mencipta, mendapatkan, mengemas kini dan memadam operasi pelanggan.

Amalan terbaik OOP dalam PHP termasuk konvensyen penamaan, antara muka dan kelas abstrak, pewarisan dan polimorfisme, dan suntikan kebergantungan. Kes praktikal termasuk: menggunakan mod gudang untuk mengurus data dan menggunakan mod strategi untuk melaksanakan pengisihan.

Bahasa Go menyokong pengaturcaraan berorientasikan objek, mentakrifkan objek melalui struct, mentakrifkan kaedah menggunakan penerima penunjuk, dan melaksanakan polimorfisme melalui antara muka. Ciri berorientasikan objek menyediakan penggunaan semula kod, kebolehselenggaraan dan enkapsulasi dalam bahasa Go, tetapi terdapat juga pengehadan seperti kekurangan konsep tradisional kelas dan pewarisan dan hantaran tandatangan kaedah.

C# (CSharp) ialah bahasa pengaturcaraan berorientasikan objek yang berkuasa dan popular yang digunakan secara meluas dalam bidang pembangunan perisian. Semasa proses pembangunan C#, adalah sangat penting untuk memahami konsep asas dan prinsip reka bentuk pengaturcaraan berorientasikan objek (OOP). Pengaturcaraan berorientasikan objek ialah paradigma pengaturcaraan yang mengabstraksi perkara di dunia nyata menjadi objek dan melaksanakan fungsi sistem melalui interaksi antara objek. Dalam C#, kelas ialah blok binaan asas pengaturcaraan berorientasikan objek dan digunakan untuk menentukan sifat dan tingkah laku objek. Apabila membangunkan C#, terdapat beberapa prinsip reka bentuk yang penting

Tiada konsep kelas dalam erti kata tradisional dalam Golang (bahasa Go), tetapi ia menyediakan jenis data yang dipanggil struktur, yang melaluinya ciri berorientasikan objek yang serupa dengan kelas boleh dicapai. Dalam artikel ini, kami akan menerangkan cara menggunakan struktur untuk melaksanakan ciri berorientasikan objek dan menyediakan contoh kod konkrit. Definisi dan penggunaan struktur Pertama, mari kita lihat definisi dan penggunaan struktur. Di Golang, struktur boleh ditakrifkan melalui kata kunci jenis dan kemudian digunakan di mana perlu. Struktur boleh mengandungi atribut
