2017-07-25 85 views
1

我目前只是搞亂了PHP,我注意到一些有趣的事情,我個人沒有注意到。匿名函數似乎不適用於對象內部。爲什麼?爲什麼匿名函數似乎被拒絕這個PHP對象

實施例:

$loop = function ($do) { 
    $i = 2; 
    $do((object) [ 
     "i" => $i, 
     "domore" => (function() { 
      echo "hi"; 
     }) 
    ]); 
}; 

$loop(function ($data) { 
    echo $data->i; 
    echo $data->domore(); 
}); 

引發Error:

2<br /> 
<b>Fatal error</b>: Uncaught Error: Call to undefined method stdClass::delay() in [...][...]:16 
Stack trace: 
#0 [...][...](10): {closure}(Object(stdClass)) 
#1 [...][...](17): {closure}(Object(Closure)) 
#2 {main} 
    thrown in <b>[...][...]</b> on line <b>16</b><br /> 

同樣地,相同的代碼與返回數據作爲一個陣列,而不是一個對象:

$loop = function ($do) { 
    $i = 2; 
    $do([ 
     "i" => $i, 
     "domore" => function() { 
      echo "hi"; 
     } 
    ]); 
}; 

$loop(function ($data) { 
    echo $data["i"]; 
    echo $data["domore"](); 
}); 

簡單地返回,如預期的那樣,2hi。這對我來說似乎很奇怪(來自JavaScript的人),所以我會很感激某種理由。請注意,這些代碼並沒有真正的生活目的,所以好的或壞的練習在這裏沒有任何影響。認爲教育。

編輯: Laravel不正是我想給我的概念,它是不可能的,但我只是在PHP中正確實現它:

DB::table('users') 
    ->join('contacts', function ($join) { 
     $join->on('users.id', '=', 'contacts.user_id')->orOn(...); 
    })->get(); 

回答

3

匿名函數中的對象正常工作。你會得到這個錯誤,因爲domore不是一種方法,而你正在調用它,它是一個恰好是閉包的屬性。爲了區分處理財產時,你需要使用括號,如:

$loop(function ($data) { 
    echo $data->i; 
    echo ($data->domore)(); 
}); 

輸出:

2hi 

爲什麼這是必要的,因爲方法和屬性,生活在不同的符號表,這意味着你可以擁有一個屬性和一個同名的方法(請不要這樣做)你需要知道哪些是正在處理的。例如: -

$foo = new class 
{ 
    public $func; 

    public function __construct() 
    { 
     $this->func = function() { 
      echo "foo"; 
     }; 
    } 

    public function func() 
    { 
     echo "bar"; 
    } 
}; 

($foo->func)(); 
$foo->func(); 

輸出:

foobar 
+0

那麼,如何laravel實現更乾淨的外觀? – Shawn31313

+0

'語法錯誤,意外'(',期待','或';'' - >'回聲($ data-> domore)();' – icecub

+0

@icecub更新您的php版本 –

相關問題