class test{ function aaa(){ echo "多餘麼"; }}
經常遇到這樣類定義之後,在其他地方沒有執行個體化也沒有調用(全域搜尋找不到類test或者函數aaa)。
既然沒有用到的地方為什麼要定義呢?
定義了,如果有用到的話是哪裡調用的?
回複內容:
class test{ function aaa(){ echo "多餘麼"; }}
經常遇到這樣類定義之後,在其他地方沒有執行個體化也沒有調用(全域搜尋找不到類test或者函數aaa)。
既然沒有用到的地方為什麼要定義呢?
定義了,如果有用到的話是哪裡調用的?
類調用一定要new嗎,調用方法一定要顯性寫出來方法名?
可能是動態調用,可能是回調,這些都是隱形的調用。
test類的話,更可能是測試類別,在項目中不會使用,供開發人員測試的。
php是支援反射的好嘛,就是允許運行時動態提供類名、函數名來裝載和調用相關類方法的好嘛~
作為動態語言,類名完全可以取自使用者輸入之類的,然後動態載入,幹嘛寫代碼裡?
比如你弄個外掛程式系統,名為xxx
的外掛程式就放在/plugin/xxx/xxx.php
,然後外掛程式的類名就叫xxx
,擁有一個方法叫init
,所以代碼裡寫的就是類似:
$a=擷取plugin目錄下的檔案夾名稱列表();foreach($a as $i){ $file="/plugin/$i/$i.php"; if(file_exists($file)) include($file);else{...} if(class_exists($i)) $t=new $i();else{...} if(method_exists($t,'init')) $t->init();else{...}}
這樣就完成了全部外掛程式的載入並初始化,可是原始碼中完全沒有出現xxx
這個字串,不就是這麼個道理麼。
@MrGeneral 的答案很贊,php 有反射
補充一點,一種可能是曆史遺留代碼,在過去的代碼中會使用這段代碼,但是重構(修改代碼使用)之後,就不使用一些舊代碼了,也沒人刪除掉,就這麼一直留著。
存在即合理。
我想有可能 在你用的架構中使用的是 call_user_func 調用的。
全域搜尋沒有,不代表這個沒被用到啊.
你要是不很確定可以嘗試注釋掉先,不過根據以往經驗,建議別做沒用的事兒,如果這個類或者函數僅僅是沒用,那麼它並不佔什麼資源,最多你注釋下這東西可能沒用就好了.
千萬別刪代碼,千萬別刪代碼,千萬別...
你在__construct()裡面寫上 echo '調用?';exit;
然後看看程式跑起來的樣子(當然有可能並不是在啟動中被調用,而是在某一個很猥瑣的角落特定的環境情境下中才調用)
xdebug斷點也是一樣的道理。
可能是final類
測試代碼
$class = $_GET['name'];// $class = 'test';$method = $_GET['method'];// $method = 'aaa';$myclass = new $class();$myclass->$method();/** *定義tst類 */class test{ function aaa() { echo __CLASS__."->".__METHOD__.PHP_EOL; }}
通過瀏覽器訪問:
http://hostname/seg.php?name=test&method=aaa
這裡命名不規範,只是為了說明問題。
執行個體化的過程這個實現方式你就看不到。
如果是注入式架構的話,類沒有找到被調用的地方也是正常的