Rumah pembangunan bahagian belakang tutorial php 给猪的鼻子插一根葱_PHP

给猪的鼻子插一根葱_PHP

Jun 01, 2016 pm 12:42 PM
object pro objek

PHP 具备一些动态语言的特征, 但不彻底. 虽然 PHP 的标志是一头大象, 可这头象的鼻子未免太短, 以致经常够不着东西, 反而象猪了. 本文旨在探讨一种使 PHP 更动态化的方法, 主要是模拟 Javascript 的 prototype 继承. 既然是模拟, 就不是真的能使 PHP 动态起来, 只是插上一根葱, 让它装得更"象"一点.

一. 基本操作
通过 Javascript 的 prototype 动态地为对象添加属性, 我们可以这样:

Object.prototype.greeting = 'Hello'
var o = new Object
alert(o.greeting)
Salin selepas log masuk

Js 的内置对象 Object 可看作一个"类", 任何 Js "类"都有 prototype 内置对象, 用 PHP 来模拟它可以是:
error_reporting(E_ALL);

class Object
{
     public static $prototype;

     protected function __get($var) {
         if ( isset(self::$prototype->$var) ) {
             return self::$prototype->$var; }}
}
Salin selepas log masuk

然后我们可以:
Object::$prototype->greeting = 'Hello';
$o = new Object;
echo $o->greeting; // 输出 Hello
Salin selepas log masuk

这里利用了 PHP 的自动转型特性. 在 PHP 中, 我们要声明一个数组, 并不需要先 $var = array() 然后才做 $var[] = some_value, 直接地使用后者就可以得到一个数组; 同样地直接 $object->var 的时候, $object 就被自动定义为 stdClass 对象. 这就解决了在定义类内静态属性时不能声明 public static $prototype = new stdClass 的问题.

在 Js 中给"类"动态添加方法:
Object.prototype.say = function(word) { alert(word) }
o.say('Hi')
Salin selepas log masuk

在 PHP 中模拟:
error_reporting(E_ALL);

class Object
{
     public static $prototype;

     protected function __get($var) {
         if ( isset(self::$prototype->$var) ) {
             return self::$prototype->$var; }}

     protected function __call($call, $params) {
         if ( isset(self::$prototype->$call) && is_callable(self::$prototype->$call) ) {
             return call_user_func_array(self::$prototype->$call, $params); }
         else {
             throw new Exception('Call to undefined method: ' . __CLASS__ . "::$call()"); }}
}
Salin selepas log masuk

这样, 就可以
Object::$prototype->say = create_function('$word', 'echo $word;');
$o->say('Hi');
Salin selepas log masuk

但是 PHP 的 create_function 返回的结果并不等同于 Js 中的 Function 对象, Js 的 Function 对象是一种闭包(closure), 它可以直接调用宿主的属性, 如
Object.prototype.rock = function() { alert(this.oops) }
o.oops = 'Oops'
o.rock()
Salin selepas log masuk

但是在 PHP 中我们不可以写
Object::$prototype->rock = create_function('', 'echo $this->oops;');
$o->oops = 'Oops';
$o->rock();
Salin selepas log masuk

会报告 Fatal error: Using $this when not in object context, 因为 create_function 返回的是匿名的普通函数, 它没有宿主. 为解决这个问题, 我们需要在参数中传入对象本身, 而且不能使用 $this 变量名做参数, 我们暂时用一个 $caller 的变量名:
Object::$prototype->rock = create_function('$caller', 'echo $caller->oops;');
$o->oops = 'Oops';
$o->rock($o);
Salin selepas log masuk

现在可以了, 可是看上去怪怪的, 一点都不像动态语言. 嗯~, 这根葱还是有点短, 还是不"象".

问题来了:
1. 在调用动态方法时需要传递对象本身, 这算哪门子的面向对象?
2. 我们要在代码中使用 $this, 这才象是在面向对象.

解决方法:
1. 重新写一个函数代替 create_function, 在参数部分挤一个参数 $that 进去作为第一个参数, 在 __call 中向匿名函数传递参数时加入对象本身 $this 作为第一参数.
2. 允许在代码中使用 $this, 我们在代替函数中把 $this 换成 $that.

我们给它添加一个 create_method 函数来代替 create_function
function create_method($args, $code) {
     if ( preg_match('/\$that\b/', $args) ) {
         throw new Exception('Using reserved word \'$that\' as argument'); }
     $args = preg_match('/^\s*$/s', $args) ? '$that' : '$that, '. $args;
     $code = preg_replace('/\$this\b/', '$that', $code);
     return create_function($args, $code); }
Salin selepas log masuk

$that 作为参数中的"保留字", 当出现在参数部分中将抛出异常.(在 PHP5 的早期暗夜版本中, $that 也曾经是保留字)

相应地, Object 中的 __call 也要作出改动
class Object
{
     public static $prototype;

     protected function __get($var) {
         if ( isset(self::$prototype->$var) ) {
             return self::$prototype->$var; }}

     protected function __call($call, $params) {
         if ( isset(self::$prototype->$call) && is_callable(self::$prototype->$call) ) {
             array_unshift($params, $this); // 这里!
             return call_user_func_array(self::$prototype->$call, $params); }
         else {
             throw new Exception('Call to undefined method: ' . __CLASS__ . "::$call()"); }}
}
Salin selepas log masuk

现在我们就可以
Object::$prototype->rock = create_method('', 'echo $this->oops;');
$o->oops = 'Oops';
$o->rock();
Salin selepas log masuk





二. 继承
面向对象的一大特征是继承, 继承最大限度地保留代码重用能力. 但如果直接用上例的 Object 类去创建继承类则会出错, 因为
1. 子类继承的静态属性 $prototype 永远属于父类(不管 $prototype 是标量还是列表, 对象更不消说)
2. 如果子类所继承的方法中有 self 关键字, self 会指向父类而非子类
class Object
{
     public static $prototype;

     protected function __get($var) {
         ... }

     protected function __call($call, $params) {
         ... }
}

class Test extends Object
{
}

Test::$prototype->greeting = 'Hello';
print_r(Object::$prototype);
/* outputs
stdClass Object
(
    [greeting] => Hello
)
*/

Test::$prototype->say = create_method('$word', 'echo $word;');
$o = new Object;
$o->say('Hi');
/* outputs
Hi
*/
Salin selepas log masuk

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Mana satu berbaloi untuk dibeli, Xiaomi Mi Pad 6 atau Pro? Mana satu berbaloi untuk dibeli, Xiaomi Mi Pad 6 atau Pro? Feb 07, 2024 pm 08:36 PM

Ramai pengguna tidak pasti yang mana satu berbaloi untuk dibeli, Xiaomi Mi Pad 6 atau Mi Pad 6. Dari sudut konfigurasi, konfigurasi Pro yang lebih tinggi pasti disyorkan, tetapi ia juga bergantung pada harga dan bajet mereka sendiri, dan kumpulan kedudukan produk yang berbeza juga Berbeza. Mana satu yang berbaloi untuk dibeli, Xiaomi Mi Pad 6 atau Pro Jawapan: Xiaomi Mi Pad 6 Pro akan menjadi lebih baik, baik dari segi prestasi dan hayat bateri kamera. 1. Pemproses Xiaomi Pad 6: Snapdragon 870 Xiaomi Mi Pad 6 Pro: pemproses Snapdragon 8+ generasi pertama yang lebih berkuasa 2. Saiz bateri Xiaomi Mi Pad 6: 8840mAh, 67W cas kedua Xiaomi Mi Pad 6 Pro: 8600mAh, 33W The fast- mengecas Xiaomi Mi Pad 6 akan mempunyai hayat bateri yang lebih baik, tetapi pengecasan akan menjadi lebih perlahan. 3. Ambil gambar dengan Xiaomi Mi Pad 6

iPhone 15 Pro Max vs iPhone 14 Pro Max: Apakah perbandingan dan perbezaan antara mereka? iPhone 15 Pro Max vs iPhone 14 Pro Max: Apakah perbandingan dan perbezaan antara mereka? Sep 19, 2023 pm 08:29 PM

iPhone 15 Pro lwn. iPhone 14 Pro: Perbandingan Spesifikasi Berikut ialah perbandingan spesifikasi antara iPhone 15 Pro Max dan iPhone 14 Pro Max: iPhone 15 Pro Max iPhone 14 Pro Max Saiz paparan 6.7 inci 6.7 inci Teknologi paparan Super Retina 2,000 nits Dimensi 6.29x3 .02x0.32 inci 6.33x3.06x0.31 inci Berat 221 gram 240 gram

Bagaimana untuk memulakan Xiaomi Mi Band 8pro Bagaimana untuk memulakan Xiaomi Mi Band 8pro Jan 14, 2024 am 08:51 AM

Ramai pengguna tidak tahu bagaimana untuk menghidupkan Xiaomi Mi Band 8 apabila mereka mula-mula bersentuhan dengannya Sebenarnya, kaedahnya sangat mudah. ​​Kami hanya perlu mencari kabel data USB dan menyambungkan jam tangan ke bekalan kuasa , dan kemudian mengecasnya untuk seketika Anda boleh menekan butang untuk menghidupkan. Cara menghidupkan Xiaomi Mi Band 8pro 1. Mula-mula pasang jam tangan iaitu sambungkan tema dan tali pada kedua-dua belah. 2. Kemudian apabila kita menghidupkan jam tangan untuk kali pertama, kita perlu menyambungkan kabel pengecasan Kaedah sambungan adalah di bahagian bawah jam tangan. 3. Tunggu sehingga jam tangan bergetar untuk dihidupkan, dan kemudian sambungkan ke telefon anda. >>>

Tukar tatasusunan atau objek kepada rentetan JSON menggunakan fungsi json_encode() PHP Tukar tatasusunan atau objek kepada rentetan JSON menggunakan fungsi json_encode() PHP Nov 03, 2023 pm 03:30 PM

JSON (JavaScriptObjectNotation) ialah format pertukaran data ringan yang telah menjadi format biasa untuk pertukaran data antara aplikasi web. Fungsi json_encode() PHP boleh menukar tatasusunan atau objek kepada rentetan JSON. Artikel ini akan memperkenalkan cara menggunakan fungsi json_encode() PHP, termasuk sintaks, parameter, nilai pulangan dan contoh khusus. Sintaks Sintaks fungsi json_encode() adalah seperti berikut: st

Perbezaan antara macbook air dan pro Perbezaan antara macbook air dan pro Feb 08, 2024 am 09:57 AM

MacBook Air ialah komputer riba Apple Ramai pengguna ingin tahu tentang perbezaan antara MacBook Air dan Pro Kedua-dua komputer riba mempunyai beberapa perbezaan dalam teras pemproses, frekuensi utama dan jenis kad grafik. Perbezaan antara MacBook Air dan Pro: 1. Teras dan benang pemproses yang berbeza: Pemproses MacBook Air mempunyai dua teras dan empat utas. Pro lebih berkuasa daripada MacBook Air, dengan empat teras dan lapan utas. 2. Kekerapan utama pemproses adalah berbeza: pemproses MacBook Air mempunyai frekuensi utama 1.6GHz. Kekerapan utama pemproses pro ialah 1.4GHz, yang lebih rendah sedikit daripada macbook air. 3. Kad grafik yang berbeza: macbookair pakai

Apakah perubahan yang akan dibawa oleh GPU A17 Pro Apple? Apakah perubahan yang akan dibawa oleh GPU A17 Pro Apple? Sep 18, 2023 pm 08:53 PM

Apple terus menolak sempadan teknologi, dan bukti terkini inovasinya ialah pelancaran GPU Apple A17 Pro. Komponen canggih ini menampilkan GPU yang direka bentuk semula sepenuhnya yang menjanjikan peningkatan ketara dalam prestasi, grafik dan pengalaman pengguna. GPU Apple A17 Pro, yang dilancarkan bersama iPhone 15 Pro, adalah keajaiban kejuruteraan semikonduktor. Ia dibina menggunakan proses 3nm, yang mewakili lonjakan besar dalam pengecilan, membungkus lebih banyak transistor ke dalam satu cip berbanding sebelum ini. Prestasi teknikal ini diterjemahkan kepada kecekapan kuasa yang lebih besar dan kuasa pengkomputeran. GPU Apple A17 Pro menyampaikan grafik yang menakjubkan Salah satu ciri menonjol cip A17 Pro ialah GPU yang direka bentuk semula. Apple telah melabur banyak dalam mengoptimumkan prestasi grafik, menjadikannya

Tarikh keluaran Xiaomi Pro14 Tarikh keluaran Xiaomi Pro14 Jan 05, 2024 pm 02:50 PM

Xiaomi pro14 sudah pun berada di pasaran, dan konfigurasinya sangat bagus untuk komputer riba pejabat perniagaan Terdapat tiga konfigurasi pemproses untuk dipilih, dan harganya tidak terlalu tinggi. Ramai rakan tidak tahu masa pelancaran khusus Xiaomi Pro14. Masa pelancaran Xiaomi Pro14 A: Xiaomi Pro14 Edisi Ryzen akan tersedia untuk prapesanan pada 10 November 2021, dengan harga permulaan bermula dari 5,299 yuan. Xiaomi Notebook Pro 14 akan dikeluarkan pada 4 Julai 2022, dan akan mula dijual secara rasmi pada tengah malam pada 8 Julai. Pengenalan Xiaomi pro14 1. Skrin ini dilengkapi dengan skrin 14-inci 2.5K Super Retina dengan resolusi 2560x1600, nisbah skrin-ke-badan sehingga 88%, gamut warna 100% sRGB, dan kadar penyegaran sebanyak 120Hz. 2. Penampilan mengamalkan 6 siri

Tiga kamera dengan zum 20x, Honor memilih Xiaopai Smart Camera Pro inovasi akan datang Tiga kamera dengan zum 20x, Honor memilih Xiaopai Smart Camera Pro inovasi akan datang Aug 23, 2024 pm 09:44 PM

Adakah anda telah memasang kamera di rumah anda? Dalam beberapa tahun kebelakangan ini, produk kamera rumah tiba-tiba menjadi popular. Saya bertanya kepada rakan-rakan saya di sekeliling saya, dan budak lelaki, setiap rumah mempunyai satu, malah ada yang mempunyai lebih daripada satu. Walau bagaimanapun, dengan populariti produk, ia juga telah membawa beberapa aduan semasa penggunaan. Contohnya, anda hanya boleh melihat satu tempat pada masa yang sama, dan jika anda ingin melihat tempat lain, anda perlu melaraskan kuali/condongkan dan memutarkan kamera ke belakang dan ke hadapan. Terdapat titik buta dan perbezaan masa semasa melihat gambar; atau apabila anda ingin melihat dengan lebih dekat lokasi tertentu di rumah anda, anda mendapati bahawa gambar itu kabur dan anda tidak dapat melihatnya sama sekali... Pengalaman itu sangat terjejas. Honor Select dan Xiaopai Technology bersama-sama melancarkan Honor Select Xiaopai Smart Camera Pro yang menampilkan "tiga kanta dan imej dwi". Menyediakan penyelesaian baharu kepada industri dan titik kesakitan pengguna

See all articles