2016-11-28 9 views
0

私はテンプレートに表示されたときにようにすぐに、オブジェクトをモックする必要があります。インラインオブジェクトから無名関数(Closure)を呼び出す方法は?

$that->user->isAdmin() 

それはtrueを返します。

私はオブジェクトに匿名関数で配列をキャストしてみました:

$that = (object) ((array(
    'user'  => 
     (object) (array(
      'isAdmin' => function() { 
       return true; 
      } 
(...) 

しかしvar_dump($that->user)空の閉鎖を返す(?):

object(stdClass)#3 (1) { 
    ["isAdmin"]=> 
    object(Closure)#2 (1) { 
    ["this"]=> 
    object(View)#1 (0) { 
    } 
    } 
} 

をして$that->user->isAdmin()リターンでそれを直接呼び出しますCall to undefined method stdClass::isAdmin()

$that->user->isAdmin()に電話するには、$thatをどのように書き換えることができますか?

汚れた/ハッキーなやり方で行うことができます。これは嘲笑の目的のみのためです。

答えて

1

$that->user->isAdminは、オブジェクトの妥当性です。これもクロージャです。 $that->user->isAdmin()で電話をしようとすると、代わりにメソッドisAdminを呼び出そうとしています。あなたは変数に$that->user->isAdminを入れて、それを呼び出す、またはその代わりにcall_user_funcを使用することができますOtherwhise

PHP7からは

$bool = ($that->user->isAdmin)(); 

でそれを呼び出すことができます。あなたがしたい場合

EDIT

方法isAdmin

$that = (object) ((array(
    'user' => new class { 
     public function isAdmin() { 
      return true; 
     } 
    }) 
)); 

$bool = $that->user->isAdmin(); 
+0

トリッキーな部分は、 ')(それは' $ that-> USER-> isAdminによって正確に呼ばれるようにならないことです、それは模擬だから。私は '$ that'オブジェクトだけを変更できます。 –

+0

クロージャーは必要ありません。編集に関しては、その名前が – Federkun

+0

であるメソッドが必要です。これはPHP7の構造体でもありますか? '予期せぬクラス '(T_CLASS)' –

関連する問題