Heim > Backend-Entwicklung > PHP-Tutorial > Cleveres Überladen der magischen Methode __call()

Cleveres Überladen der magischen Methode __call()

WBOY
Freigeben: 2016-08-08 09:31:24
Original
847 Leute haben es durchsucht

Ich arbeite seit einem halben Jahr und habe das Gefühl, dass ich in diesem halben Jahr mehr gelernt habe als in vier Jahren am College. Der Hauptgrund dafür ist, dass mein Geist sich beruhigt hat und meine Ziele klar sind, und das werde ich auch tun nicht den ganzen Tag mit Spielen beschäftigt sein. Als ich auf dem College war, wurde mir tatsächlich klar, dass das Spielen von Spielen mein normales Lernen und Arbeiten beeinträchtigen würde, aber ich konnte mich trotzdem nicht beherrschen und konnte nicht anders, als oft zu spielen, Tag und Nacht (ich war ursprünglich ein schwüler Typ, und Ich bin immer noch zu Hause geblieben und habe Spiele gespielt, das ist auch einer der Gründe, warum ich während der vier Jahre auf dem College nur Spiele, linke und rechte Hände und keine Freundinnen hatte. Jetzt, wo ich arbeite, habe ich jeden Tag Aufgaben. Wenn ich die talentierten Leute neben mir sehe, die wie eine Ente im Wasser an dem Projekt arbeiten, kommt mir die Idee, sie einzuholen, also gebe ich mir ein Extra-Kleingeld Ich arbeite jetzt seit einem halben Jahr an der Aufgabe, Linux zu verwenden, mit dem ich vorher nicht vertraut war. Ich habe auch ein neues Verständnis von JS dass ich jetzt kompetent im Job bin (unterteilt in Anfänger, fortgeschrittener Anfänger, kompetent und kompetent), habe Aktivitäten, Schnittstellen und Backends entwickelt und habe auch das System-Framework optimiert und verbessert, soweit es sinnvoll ist Bei Bedarf, der durch den Produktbetrieb entsteht, kann schnell geholfen werden. Natürlich habe ich eines wirklich: Programmierer sind wirklich eine seltsame Gruppe. Meistens denken sie immer, dass ihre eigenen Ideen die besten sind. Natürlich gilt das als Selbstvertrauen, aber manchmal ist Ihre Aggressivität bei Diskussionen nicht unbedingt eine gute Sache, deshalb sollten Sie auf die Ideen anderer hören. Sie können nicht nur Ihre eigenen Mängel entdecken, sondern auch Bauen Sie auch gute Freundschaften auf: „“. Ich habe Ihnen in den letzten sechs Monaten so viel über meine Gefühle erzählt. Vielen Dank, dass Sie bei mir geblieben sind und es gelesen haben^_^.

Lassen Sie uns nun auf die eigentliche Frage eingehen und darüber sprechen, wie man die magische Methode von PHP geschickt einsetzen kann. Ich glaube, dass sie in den meisten Projekten zum Einsatz kommen wird.

Lassen Sie mich zunächst erklären, dass ich diesen kleinen Trick in meinem Projekt sehr gut angewendet habe und er unserem Projekt große Erleichterung gebracht hat. Ich werde Ihnen hier einige Details geben. Vielleicht möchten Sie weiterlesen.

Im Projekt muss eine große Menge an Konfigurationsinformationen konfiguriert werden können, z. B. der Roboteröffnungszeitraum eines Spiels, ob die Zahlungsmethode aktiviert ist, die Konfiguration der Titelanzeige im Einkaufszentrum usw Ein Merkmal dieser Konfigurationsinformationen ist, dass es keine spezifischen Regeln gibt und die Produktoperationen jederzeit entsprechend der tatsächlichen Situation geändert werden können. Es ist definitiv nicht möglich, eine Tabelle für jeden Typ zu erstellen . Das ist einfach undankbar, vielleicht ist nur eine Information in der Tabelle gespeichert, also muss man sich andere Methoden ausdenken, die es gibt wird nicht zu viel sein, und im Allgemeinen kann ein Array alle zu konfigurierenden Informationen speichern, daher ist die Verwendung einer Json-Zeichenfolge eine gute Wahl zum Speichern von Informationen. Wenn Sie sie verwenden müssen, nehmen Sie einfach den json_decode heraus und können ihn verwenden Schauen wir uns direkt an, wie man die magische Methode von PHP geschickt nutzt, um dies zu erreichen.

Hier müssen Sie zunächst __call() verstehen, eine magische Methode von PHP. Sehen Sie sich die offizielle PHP-Dokumentation an, in der diese Funktion wie folgt erklärt wird

<span>public</span> <span>mixed</span> __call ( <span>string</span> <span>$name</span> , <span>array</span> <span>$arguments</span><span> )

__call() is triggered when invoking inaccessible methods in an </span><span>object</span> context.
Nach dem Login kopieren

Dies bedeutet, dass diese Funktion ausgelöst wird, wenn in einem Objekt eine nicht zugängliche Methode (keine Berechtigung, Nichtexistenz) aufgerufen wird. Der Parameter $name der Funktion ist der Name der aufgerufenen Funktion und $arguments ist der Parameter Array der aufgerufenen Funktion. Schauen Sie sich dieses Beispiel an:

<span>class</span><span> Test
{
    </span><span>public</span> <span>function</span> __call(<span>$name</span>, <span>$arguments</span><span>)
    {
        </span><span>echo</span> "你调用了一个不存在的方法:\r"<span>;
        </span><span>echo</span> "函数名:{<span>$name</span>}\r"<span>;
        </span><span>echo</span> "参数: \r"<span>;
        </span><span>print_r</span>(<span>$arguments</span><span>);
    }
}

</span><span>$T</span> = <span>new</span><span> Test();
</span><span>$T</span>->setrobottime("12", "18");
Nach dem Login kopieren

Diese Funktion gibt die folgenden Ergebnisse aus

<span>你调用了一个不存在的方法:
函数名:setrobottime
参数: 
Array
(
    [</span>0] => 12<span>
    [</span>1] => 18<span>
)</span>
Nach dem Login kopieren

Auf diese Weise können wir die Funktion nicht direkt definieren, sondern diese Funktion verwenden, um etwas zu tun. Schauen wir uns die Implementierungsideen des Codes an, hauptsächlich die Ideen, von denen ich einige Annahmen getroffen habe, wie z. B. Datenbankverbindungen, auf die ich mich hier nicht konzentrieren werde.

<span>class</span><span> Config
{
    </span><span>/*</span><span>*
     * 这里假定下数据库表名为
     * config.config,
     * 字段为:
     * config_key varchar(50),
     * config_value text,
     * primary key(config_key)
     *
     * 数据库连接为$link
     * 插入方法封装为query
     * 获取一条信息方法封装为getOne
     </span><span>*/</span>
    <span>/*</span><span>*
     * 要进行的操作
     </span><span>*/</span>
    <span>private</span> <span>static</span> <span>$keys</span> = <span>array</span><span>(
        </span><span>//</span><span>'调用方法' => 'key',</span>
        'roboottime'    => 'ROBOOTTIME',
        'dailysignin'   => 'DAILYSIGNIN',<span>
    );

    </span><span>/*</span><span>*
     * 设置方法
     * @param string $config_key 配置项key
     * @param string $config_value 配置型内容(一般为json格式)
     * @returne boolen true/false 插入是否成功
     </span><span>*/</span>
    <span>private</span> <span>function</span> set(<span>$config_key</span>, <span>$config_value</span><span>){
        </span><span>$sql</span> = "insert into config.config (config_key,config_value) values ('{<span>$config_key</span>}','{<span>$config_value</span>}') on duplicate key update config_value='{<span>$config_value</span>}'"<span>;
        </span><span>return</span> <span>$link</span>->query(<span>$sql</span><span>);
    }

    </span><span>/*</span><span>*
     * 获取值的方法
     * @param $config_key 要获取的配置的key
     * @returne string/false json字符串/失败
     </span><span>*/</span>
    <span>private</span> <span>function</span> get(<span>$config_key</span><span>)
    {
        </span><span>$sql</span> = "select * from config.config where config_key='{<span>$config_key</span>}'"<span>;
        </span><span>if</span>(<span>$ret</span> = <span>$link</span>->getOne(<span>$sql</span>,<span> MYSQL_ASSOC)){
            </span><span>return</span> <span>$ret</span><span>;
        }
        </span><span>return</span> <span>false</span><span>;
    }

    </span><span>/*</span><span>*
     * 重载魔术方法
     * @param string $name 被调用的方法名
     * @param array $arguments 调用时传递的参数
     * @return mixed 返回结果
     </span><span>*/</span>
    <span>public</span> <span>function</span> __call(<span>$name</span>, <span>$arguments</span><span>)
    {
        </span><span>$act</span>    = <span>substr</span>(<span>$name</span>, 0, 3<span>);
        </span><span>$func</span>   = <span>substr</span>(<span>$name</span>, 3<span>);
        </span><span>if</span>(!<span>in_array</span>(<span>$func</span>, self::<span>$keys</span><span>)){
            </span><span>return</span> <span>false</span><span>;
        }
        </span><span>if</span>(<span>$act</span> == 'set'<span>)
        {
            </span><span>return</span> <span>$this</span>->set(self::[<span>$func</span>], <span>$arguments</span>[0<span>]);
        }
        </span><span>elseif</span>(<span>$act</span> == 'get'<span>)
        {
            </span><span>return</span> <span>$this</span>->get(self::[<span>$func</span><span>]);
        }
        </span><span>return</span> <span>false</span><span>;
    }
}</span>
Nach dem Login kopieren

Auf diese Weise können wir mehrere Informationen über eine Tabelle speichern, und es ist auch sehr praktisch, wenn wir die Informationen im Config::$keys-Array erweitern. Dies dient nur der Standardisierung und der Erstellung möglichst genau wissen, welche Konfigurationen in dieser Tabelle gespeichert sind.

Wenn Sie es verwenden, können Sie es so speichern und abrufen

<span>$config</span> = <span>new</span><span> Config();

</span><span>$info</span> = <span>array</span>("12","20"<span>);

</span><span>//</span><span>设置</span>
<span>$config</span>->setroboottime(json_encode(<span>$info</span><span>));

</span><span>//</span><span>获取</span>
<span>$config</span>->getroboottime();
Nach dem Login kopieren

Hier ist ein weiterer Punkt zu beachten. Diese Konfigurationsinformationen werden im Allgemeinen in der Datenbank gespeichert, um eine Wiederherstellung aus der Datenbank zu verhindern. Um die Interaktion mit der Datenbank zu reduzieren, wird es direkt im Cache abgelegt.

Das Urheberrecht dieses Artikels liegt beim Autor (luluyrt@163.com). Nach dem Nachdruck des Artikels müssen der Autor und der Originaltext-Link angegeben werden an einer offensichtlichen Stelle auf der Artikelseite, andernfalls behalten wir uns die Geltendmachung gesetzlicher Haftungsrechte vor.

gepostet am 2015-01-10 12:23 Running Man Lesen (...) Kommentieren (...) Sammlung bearbeiten

Kommentare aktualisieren Seite aktualisieren Zurück zum Anfang

Blog Park Homepage Bowen News Flash Wissensdatenbank zur Rekrutierung von Programmierern

公告

Copyright ©2015 奔跑的Man

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage