<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 反射 反射API功能很強大,甚至能還原這個類的原型,包括方法的訪問權限 ~~~ <?php class Person { public $gender; public $name; public function __get($param) { } public function __set($key, $value) { } public function say() { } } //反射獲取類的原型 $obj = new ReflectionClass('Person'); $className = $obj->getName(); $methods = $Properties = []; foreach ($obj->getProperties() as $key => $value) { $Properties[$value->getName()]=$value; } foreach ($obj->getMethods() as $key => $value) { $Methods[$value->getName()] = $value; } echo "Class {$className}".PHP_EOL."{".PHP_EOL; is_array($Properties) && ksort($Properties); foreach ($Properties as $key => $value) { echo PHP_EOL; echo $value->isPublic()? 'public':'',$value->isPrivate()?'private':'', $value->isProtected()?'protected':'', $value->isStatic()?'static':''; echo PHP_EOL,$key,PHP_EOL; } echo PHP_EOL; if (is_array($Methods)) ksort($Methods); foreach ($Methods as $key => $value) { echo PHP_EOL,"function {$key} () {}",PHP_EOL; } echo '}',PHP_EOL; ~~~ # 動態代理 ~~~ <?php class mysql { public function connect ($db) { echo "連接到數據庫 ${db[0]}",PHP_EOL; } } class sqlproxy { //保存連接數據庫 private $target; public function __construct($tar) { //把連接數據庫的保存到這里 $this->target[] = new $tar; } public function __call($name, $args) { //使用魔術方法動態代理不需要實現和目標對象一樣的方法 //因為自己這個__call就代表所有方法(除靜態的) foreach($this->target as $obj) { $r = new ReflectionClass($obj); if($method = $r->getMethod($name)) { if($method->isPublic() && !$method->isAbstract()) { //可以在前置和后置做一些你自定義的事情 echo '方法前置攔截記錄---log',PHP_EOL; //可以調用你原來mysql類的方法 $method->invoke($obj, $args); echo '方法后置攔截記錄---log',PHP_EOL; } } } } } $obj = new sqlproxy('mysql'); $obj->connect('member'); ~~~ 反射能保持代碼的簡潔,但是他違背了封裝性 php有token函數,可以通過這一機制實現一些反射功能 注意這邊的count函數,php7.2有變化注意 ~~~ <?php $tokens = token_get_all('<?php echo(123);'); // print_r($tokens);die; for($i=0; $i < count($tokens); $i++){ for($j=1; $j < count($tokens[$i]); $j++){ echo PHP_EOL; //token_name可以將數字表示的字符串的類型轉化為php中固定名稱,此函數PHP自帶 $token_name = token_name($tokens[$i][0]); echo $token_name; echo PHP_EOL; //把預定義的字符轉換為 HTML 實體 echo htmlspecialchars($tokens[$i][$j]); } } $tokens = token_get_all('<?php echo(123); ?>'); for($i=0 ; $i<count($tokens);$i++){ for($j=0 ; $j<count($tokens[$i]);$j++){ echo PHP_EOL; echo htmlspecialchars($tokens[$i][$j]); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看