PHP有其神奇的方法__call
和__callStatic
,它允許截取對不存在的方法的調用。我正在尋找一種方法來攔截對不存在的函數(位於名稱空間內而不是類型內)的調用。是否可以截取對不存在函數的調用?
可以做(PHP7)嗎?
有一段時間我考慮把函數放在代理類中,但命名空間可以跨越幾個文件,如果我沒有弄錯,PHP沒有部分類,因此這種方法是沒有用的。
更新:每個命名空間問題有多個文件。
比方說,我有文件A.php和B.php,都使用相同的名稱空間,比如Text
。考慮將所有函數都放到代理類中。現在我有文件C.php,我打電話給Text\indexOf(...)
。但是我不知道這是Text\proxyA::indexOf
還是Text\proxyB::indexOf
,因爲我擁有的所有信息都是名稱空間的名稱 - Text
- 和函數名稱。所以從來電方我烤了。
如果通過「截取」您的意思是「通過返回我自己選擇的值來正常解析調用」,那麼不,這是不可能的。但我真的好奇 - 用例會是什麼? – Jon
@Jon,通過攔截我的意思是什麼'__callStatic'只有一個區別 - 目標是命名空間不是一個類型。目的,我正在處理類似於C++中的模板,我會攔截一個函數調用,取消名稱的調用,並調用函數工廠生成(然後調用)該函數的專用版本(我使用PHP作爲後端語言:http://aboutskila.wordpress.com/)。 – greenoldman
那麼,如果你需要這個功能,那你爲什麼要編譯來直接調用函數呢?你可以編譯爲'resolve_function_call('mangled_name',['argument','list'])'並解決問題。或者甚至用專門爲此目的創建的類型上的靜態方法調用替換裸函數調用,這會使用__callStatic攔截它們。 – Jon