一千萬個為什麽

搜索

PHP對象可以響應未定義的方法嗎?

Rails依賴於Ruby的一些簡潔方面。其中之一是能夠響應未定義的方法。

考慮 DogOwner。 Owner has_many:dogs 和Dog belongs_to:owner 之間的關系。

If you go into script/console, get a dog object with fido = Dog.find(1), and look at that object, you won't see a method or attribute called Owner.

看到的是 owner_id 。如果你要求 fido.owner ,對象會做這樣的事情(至少,這就是它在我看來):

  1. 我被要求提供 .owner 屬性。我沒有其中一個!
  2. 在我拋出 NoMethodError 之前,我是否有關於如何處理此問題的規則?
  3. 是的,我這樣做:我應該查看是否有 owner_id
  4. 我做到了!好的,然後我將進行連接並返回該所有者對象。

PHP的文檔是 - 嗯 - 有時候有點缺乏,所以我想知道這裏是否有人知道答案:

我可以為PHP中的對象定義類似的行為嗎?

如果沒有,您是否知道這些靈活模型連接的解決方法?

最佳答案

您可以實施 __ call() PHP中的方法,它是一個用於調用其他無法訪問的方法的全部方法。

class MyObj {
  public function __call($name, $args) {
    $list = $args ? '"' . implode('", "', $args) . '"' : '';
    echo "Call $name($list)\n";
  }
}

$m = new MyObj;
$m->method1(1, 2, 3);
$m->method2();

某些語言(例如Javascript)也具有所謂的一等函數。這實際上允許您動態添加或刪除對象(或類)中的方法。 PHP語法(從5.3開始)排序支持這一點,但它並不真正可用。

$obj = new stdClass;
$obj->foo = function() {
  echo "hello\n";
};

print_r($obj);

輸出:

stdClass Object
(
    [foo] => Closure Object
        (
        )

)

但試試:

$obj->foo();

你得到:

Fatal error:  Call to undefined method stdClass::foo() in C:\xampp\htdocs\test.php on line 8

然而:

$f = $obj->foo;
$f();

正確輸出 hello

轉載註明原文: PHP對象可以響應未定義的方法嗎?