比方說,我有靜態的連接器,允許不同的適配器的代理實例:HackLang類型不同的對象
$m = Connector::take('mcrouter');
$db = Connector::take('production_database');
連接器必須初始化和運行期間處理連接:
protected $connection;
abstract protected function openConnection($config);
某處內部適配器:
$this->connection = $this->openConnection($config);
連接是一個對象,可能是Memcached,MySQLi的一個實例等等或NULL。 所以邏輯上我想這樣做:
protected ?object $connection;
abstract protected function openConnection($config):?object;
但在同一時間連接是不是真正的「對象」的情況下,它是memcached的實例,例如,其結果是:
Catchable fatal error: Hack type error: Invalid assignment
在這種情況下唯一的解決方案是根本不定義類型。 定義通用對象有一些技巧嗎?
感謝您的詳細解答!我使用接口和抽象類,但是我意識到這種方法本身並不適合嚴格的打字,似乎是PHP的正常設計,而對於Hack來說則是糟糕的設計。我無法使用某些AdapterInterface擴展默認的Memcached類,只用於打開/關閉連接方法,與我無法執行「MemcachedAdapter擴展\ Memcached實現AdapterInterface」的方式相同,原因很多。方法名稱的截取,或者在這種情況下,我必須將Memcached和Mysql的方法結合在一個接口中,這是奇怪和糟糕的設計 –