php實作一段非常有趣的程式碼(可擴充)

WBOY
發布: 2016-08-08 09:23:24
原創
1247 人瀏覽過

扒了扒之前的雲筆記,發現了一些很有趣的筆記,下面是一段php程序,可以動態的加入成員函數以及成員變數。是之前在php手冊上看到的,感覺很有意思,分享給大家。

//整个类同过闭包以及魔法方法动态的添加了一系列的全局变量以及函数,在编程过程中对扩展一个方法是非常有用的
//构造方法中表示在构造的时候可以传入一个数组,同事数组的键值为属性名,值为属性值
//__call方法表示对没有的方法时调用此方法
<?php
//定义一个类
class stdObject {
    public function __construct(array $arguments = array()) {
        if (!empty($arguments)) {
            foreach ($arguments as $property => $argument) {
                $this->{$property} = $argument;
            }
        }
    }

//魔法方法,当没有调用的函数是回调此方法
    public function __call($method, $arguments) {
    //将对象本身作为参数的第一个值合并到参数中
        $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
//判断是否存在调用的模块,如果存在判断是否可以调用,如果可以调用,将模块(函数)名,和参数通过call_user_func_array()去执行函数
        if (isset($this->{$method}) && is_callable($this->{$method})) {
            return call_user_func_array($this->{$method}, $arguments);
        } else {
            throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
        }
    }
}

// Usage.

$obj = new stdObject();
//定义类中的全局变量
$obj->name = "Nick";
$obj->surname = "Doe";
$obj->age = 20;
$obj->adresse = null;
//定义的一个闭包函数
$obj->getInfo = function($stdObject) { // $stdObject referred to this object (stdObject).
    echo $stdObject->name . " " . $stdObject->surname . " have " . $stdObject->age . " yrs old. And live in " . $stdObject->adresse;
};

$func = "setAge";
$obj->{$func} = function($stdObject, $age) { // $age is the first parameter passed when calling this method.
    $stdObject->age = $age;
};
//调用闭包函数
$obj->setAge(24); // Parameter value 24 is passing to the $age argument in method 'setAge()'.

// Create dynamic method. Here i'm generating getter and setter dynimically
// Beware: Method name are case sensitive.
//循环取出对象中的函数/变量名,分别动态生成对应的set和get函数
foreach ($obj as $func_name => $value) {
    if (!$value instanceOf Closure) {

        $obj->{"set" . ucfirst($func_name)} = function($stdObject, $value) use ($func_name) { // Note: you can also use keyword 'use' to bind parent variables.
            $stdObject->{$func_name} = $value;
        };

        $obj->{"get" . ucfirst($func_name)} = function($stdObject) use ($func_name) { // Note: you can also use keyword 'use' to bind parent variables.
            return $stdObject->{$func_name};
        };

    }
}
//调用函数
$obj->setName("John"); //会首先调用__call函数,之后会回调到闭包函数定义的地方
$obj->setAdresse("Boston");

$obj->getInfo();
?> 
登入後複製

以上就介紹了php實作一段非常有趣的程式碼(可擴充),包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板