2015-03-23 2 views
-1

Добрый день,PHP forward_static_call_array в контексте нестатического класса

У меня есть следующие TestCase, что я не могу получить, чтобы работать должным образом.

<?php 

class TestClass{ 
private $obj    = NULL; 



public function __construct(){ 
    $this->obj = new SubClass();  
} 



public function test(){ 
    forward_static_call_array('SubClass::callMe', func_get_args()); 
} 
} 


class SubClass{ 
    public function callMe(){ 
     echo 'YES WE FETCHED : '.PHP_EOL.print_r(func_get_args(), true); 
    } 
} 



$test = new TestClass(); 
$test->test('John', 'Doe', array('Peter', 'Dora'), array('Anthony', 'William')); 
?> 

Как видите, у меня есть два класса.

1 TestClass

Это не статический класс, который неоспоримый называют:

$test = new TestClass(); 
$test->test('John', 'Doe', array('Peter', 'Dora'), array('Anthony', 'William')); 

В TestClass() загружает с конструктором нового класса внутри родительского класса.

public function __construct(){ 
    $this->obj = new SubClass();  
} 

Затем я загружаю метод класса под названием тест() с помощью следующей строки:

$test->test('John', 'Doe', array('Peter', 'Dora'), array('Anthony', 'William')); 

Затем этот метод извлекает аргументы функции с: func_get_args() и передает все аргументы с forward_static_call_array()

Как следует из:

public function test(){ 
    forward_static_call_array('SubClass::callMe', func_get_args()); 
} 

Вызов его:

  • SubClass :: CallME

делает это статический класс. И логически я получаю сообщение об ошибке:

Строгие стандарты: forward_static_call_array() ожидает параметр 1, чтобы быть действительным обратного вызова, не статический метод SubClass :: CallME() не должен вызываться статически N: \ WAMP \ WWW \ Test \ forward_arguments \ testclass.php на линии 15

2 SubClass

подкласс извлекает аргументы следующим образом:

public function callMe(){ 
    echo 'YES WE FETCHED : '.PHP_EOL.print_r(func_get_args(), true); 
} 

Теперь с этой установкой уведомление об ошибке является логическим. И TestClass переменная класса

private $obj    = NULL; 

прибудет совершенно избежать.

$this->obj = new SubClass();  

Проблема конкретных

Проблема заключается в следующем один:

forward_static_call_array('SubClass::callMe', func_get_args()); 

Синтаксис должны быть разными. Но я понятия не имею, как это сделать. Спасибо заранее!

Edit:

Проблема заключается в том, что я знаю, как назвать статические методы класса. Но я не знаю, как вызвать метод в загруженном классе.

Решение

(предоставляется: Rizier123)

<?php 

class TestClass{ 
    private $obj    = NULL; 



    public function __construct(){ 
     $this->obj = new SubClass();  
     $this->obj->SetExtra(array('Karel', 'Anton')); 
    } 



    public function test(){ 
     forward_static_call_array([$this->obj, 'callMe'], func_get_args()); 
    } 
} 


class SubClass{ 
    private $SetVar = NULL; 

    public function callMe(){ 
     $Array = $this->ArrayStrUp(array_merge(func_get_args(), $this->SetVar)); 

     echo 'YES WE FETCHED : '.PHP_EOL.print_r($Array, true); 
    } 

    public function SetExtra($vars){ 
     $this->SetVar = $vars; 
    } 



    private function ArrayStrUp($Arr){ 
     foreach($Arr as $key => $value){ 
      if(is_array($value) === true){ 
       $Arr[$key] = $this->ArrayStrUp($value); 
      } 
      else{ 
       $Arr[$key] = strtoupper($value); 
      } 
     } 

     return($Arr); 
    } 
} 



$test = new TestClass(); 
$test->test('John', 'Doe', array('Peter', 'Dora'), array('Anthony', 'William')); 
?> 
+0

Что бы вы ожидаете в качестве выхода и каков ваш выходной ток? Также у вас нет каких-либо статических функций в ваших классах! – Rizier123

+0

Я знаю. И я хочу использовать переменную класса $ obj Так что это должно быть 'forward_static_call_array ('$ this-> obj-> callMe', func_get_args());' Но это не работает: -o –

ответ

2

Я думаю, что вы хотите изменить:

forward_static_call_array('SubClass::callMe', func_get_args()); 

к:

forward_static_call_array([$this->obj, 'callMe'], func_get_args()); 

И вы также должны объявить ваш статический метод, например:

class SubClass{ 
    public static function callMe(){ 
     //^^^^^^ See here 
     echo 'YES WE FETCHED : '.PHP_EOL.print_r(func_get_args(), true); 
    } 
} 
+0

Это работает! Благодаря!! Добавлен полный рабочий код в вопросе. Плюс я добавил некоторые дополнительные опции, чтобы доказать функционирование концепции. –

+0

Как мы должны иметь дело с экзотическими случаями, когда имя класса генерируется динамически? (например: имя класса - это строка, содержащаяся в строковой переменной) – FMaz008

+0

@ FMaz008 Как и в примере '$ this-> obj' будет содержать имя класса. – Rizier123