给猪的鼻子插一根葱_PHP
PHP 具备一些动态语言的特征, 但不彻底. 虽然 PHP 的标志是一头大象, 可这头象的鼻子未免太短, 以致经常够不着东西, 反而象猪了. 本文旨在探讨一种使 PHP 更动态化的方法, 主要是模拟 Javascript 的 prototype 继承. 既然是模拟, 就不是真的能使 PHP 动态起来, 只是插上一根葱, 让它装得更"象"一点.
一. 基本操作
通过 Javascript 的 prototype 动态地为对象添加属性, 我们可以这样:
Object.prototype.greeting = 'Hello' var o = new Object alert(o.greeting)
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; }} }
然后我们可以:
Object::$prototype->greeting = 'Hello'; $o = new Object; echo $o->greeting; // 输出 Hello
这里利用了 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')
在 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()"); }} }
这样, 就可以
Object::$prototype->say = create_function('$word', 'echo $word;'); $o->say('Hi');
但是 PHP 的 create_function 返回的结果并不等同于 Js 中的 Function 对象, Js 的 Function 对象是一种闭包(closure), 它可以直接调用宿主的属性, 如
Object.prototype.rock = function() { alert(this.oops) } o.oops = 'Oops' o.rock()
但是在 PHP 中我们不可以写
Object::$prototype->rock = create_function('', 'echo $this->oops;'); $o->oops = 'Oops'; $o->rock();
会报告 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);
现在可以了, 可是看上去怪怪的, 一点都不像动态语言. 嗯~, 这根葱还是有点短, 还是不"象".
问题来了:
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); }
$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()"); }} }
现在我们就可以
Object::$prototype->rock = create_method('', 'echo $this->oops;'); $o->oops = 'Oops'; $o->rock();
二. 继承
面向对象的一大特征是继承, 继承最大限度地保留代码重用能力. 但如果直接用上例的 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 */

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Viele Nutzer sind sich nicht sicher, welches sich lohnt zu kaufen, Xiaomi Mi Pad 6 oder Mi Pad 6. Aus Konfigurationssicht ist die höhere Konfiguration von Pro auf jeden Fall zu empfehlen, es kommt aber auch auf den Preis und das eigene Budget an Verschiedene Produktpositionierungsgruppen sind ebenfalls unterschiedlich. Welches ist den Kauf wert, Xiaomi Mi Pad 6 oder Pro? Antwort: Das Xiaomi Mi Pad 6 Pro wird besser sein, sowohl in Bezug auf die Leistung als auch auf die Akkulaufzeit der Kamera. 1. Prozessor Xiaomi Pad 6: Snapdragon 870 Xiaomi Mi Pad 6 Pro: leistungsstärkerer Snapdragon 8+ Prozessor der ersten Generation 2. Akkugröße Xiaomi Mi Pad 6: 8840 mAh, 67 W Zweite Ladung Xiaomi Mi Pad 6 Pro: 8600 mAh, 33 W Das schnelle Das Aufladen des Xiaomi Mi Pad 6 hat eine längere Akkulaufzeit, der Ladevorgang ist jedoch langsamer. 3. Machen Sie Fotos mit dem Xiaomi Mi Pad 6

iPhone 15 Pro vs. iPhone 14 Pro: Vergleich der technischen Daten Hier ist ein Vergleich der technischen Daten zwischen iPhone 15 Pro Max und iPhone 14 Pro Max: iPhone 15 Pro Max iPhone 14 Pro Max Displaygröße 6,7 Zoll 6,7 Zoll Displaytechnologie Super Retina 2.000 Nits Abmessungen 6,29 x 3,5 Zoll 0,02 x 0,32 Zoll 6,33 x 3,06 x 0,31 Zoll Gewicht 221 Gramm 240 Gramm

Viele Benutzer wissen nicht, wie sie das Xiaomi Mi Band 8 zum ersten Mal einschalten sollen. Tatsächlich ist die Methode sehr einfach. Wir müssen nur das USB-Datenkabel finden und die Uhr an die Stromversorgung anschließen , und laden Sie es dann für eine Weile auf. Sie können die Taste drücken, um es einzuschalten. So schalten Sie das Xiaomi Mi Band 8pro ein 1. Installieren Sie zuerst die Uhr, dh verbinden Sie das Thema und das Armband auf beiden Seiten. 2. Wenn wir die Uhr dann zum ersten Mal einschalten, müssen wir das Ladekabel anschließen. Die Verbindungsmethode befindet sich an der Unterseite der Uhr. 3. Warten Sie, bis die Uhr beim Einschalten vibriert, und stellen Sie dann eine Verbindung zu Ihrem Telefon her. >>>

JSON (JavaScriptObjectNotation) ist ein leichtes Datenaustauschformat, das sich zu einem gängigen Format für den Datenaustausch zwischen Webanwendungen entwickelt hat. Die json_encode()-Funktion von PHP kann ein Array oder Objekt in einen JSON-String konvertieren. In diesem Artikel wird die Verwendung der json_encode()-Funktion von PHP vorgestellt, einschließlich Syntax, Parametern, Rückgabewerten und spezifischen Beispielen. Syntax Die Syntax der Funktion json_encode() lautet wie folgt: st

MacBook Air ist ein Apple-Laptop. Viele Benutzer sind neugierig auf die Unterschiede zwischen MacBook Air und Pro. Diese beiden Notebooks weisen einige Unterschiede im Prozessorkern, der Hauptfrequenz und dem Grafikkartentyp auf. Die Unterschiede zwischen MacBook Air und Pro: 1. Unterschiedliche Prozessorkerne und Threads: Der Prozessor des MacBook Air verfügt über zwei Kerne und vier Threads. Das Pro ist mit vier Kernen und acht Threads leistungsstärker als das MacBook Air. 2. Die Hauptfrequenz des Prozessors ist unterschiedlich: Der Prozessor des MacBook Air hat eine Hauptfrequenz von 1,6 GHz. Die Hauptfrequenz des Pro-Prozessors beträgt 1,4 GHz und ist damit etwas niedriger als die des MacBook Air. 3. Verschiedene Grafikkarten: MacBookair übernimmt

Xiaomi pro14 ist bereits auf dem Markt und die Konfiguration ist für ein Business-Office-Notebook sehr gut. Es stehen drei Prozessorkonfigurationen zur Auswahl, und der Preis ist nicht besonders hoch. Viele Freunde kennen den genauen Startzeitpunkt des Xiaomi Pro14 nicht. Startzeitpunkt des Xiaomi Pro14 A: Die Xiaomi Pro14 Ryzen Edition kann am 10. November 2021 zu einem Anfangspreis ab 5.299 Yuan vorbestellt werden. Das Xiaomi Notebook Pro 14 erscheint am 4. Juli 2022 und wird am 8. Juli um Mitternacht offiziell in den Verkauf gehen. Xiaomi pro14 Einführung 1. Der Bildschirm ist mit einem 14-Zoll-2,5K-Super-Retina-Bildschirm mit einer Auflösung von 2560 x 1600, einem Bildschirm-zu-Körper-Verhältnis von bis zu 88 %, einem 100 % sRGB-Farbraum und einer Bildwiederholfrequenz von ausgestattet 120Hz. 2. Aussehen übernimmt 6er-Reihe

Apple verschiebt weiterhin die Grenzen der Technologie und der jüngste Beweis seiner Innovation ist die Einführung der Apple A17 Pro GPU. Diese hochmoderne Komponente verfügt über eine komplett neu gestaltete GPU, die deutliche Verbesserungen bei Leistung, Grafik und Benutzererfahrung verspricht. Die Apple A17 Pro GPU, die zusammen mit dem iPhone 15 Pro auf den Markt kam, ist ein Wunderwerk der Halbleitertechnik. Er wird im 3-nm-Verfahren hergestellt, was einen großen Schritt in der Miniaturisierung darstellt und mehr Transistoren als je zuvor auf einem einzigen Chip vereint. Diese technische Leistung führt zu einer höheren Energieeffizienz und Rechenleistung. Die Apple A17 Pro-GPU liefert atemberaubende Grafiken. Eines der herausragenden Merkmale des A17 Pro-Chips ist seine neu gestaltete GPU. Apple hat viel in die Optimierung der Grafikleistung investiert und dies erreicht

Haben Sie in Ihrem Zuhause Kameras installiert? In den letzten Jahren sind Heimkameraprodukte plötzlich ein Hit geworden. Ich habe meine Freunde um mich herum gefragt, und Junge, jedes Haus hat eines, und manche haben sogar mehr als eines. Mit der Beliebtheit des Produkts sind jedoch auch einige Beschwerden bei der Anwendung aufgetreten. Sie können beispielsweise nur einen Ort gleichzeitig sehen, und wenn Sie andere Orte sehen möchten, müssen Sie die Schwenk-/Neigungsfunktion anpassen und die Kamera hin und her drehen. Beim Betrachten gibt es einen gewissen toten Winkel und einen Zeitunterschied das Bild; oder wenn Sie sich einen bestimmten Ort in Ihrem Zuhause genauer ansehen möchten, stellen Sie fest, dass das Bild überhaupt nicht sichtbar ist usw. Die Klarheit ist stark beeinträchtigt. Honor Select und Xiaopai Technology haben gemeinsam die Honor Select Xiaopai Smart Camera Pro mit „drei Objektiven und zwei Bildern“ auf den Markt gebracht. Bietet neue Lösungen für Branchen- und Benutzerprobleme
