2015-03-23 1 views
-1

Bonjour,PHP forward_static_call_array dans un contexte de classe non statique

je le testcase suivant que je ne peux pas travailler correctement.

<?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')); 
?> 

Comme vous le voyez, j'ai deux classes.

1 TestClass

Ceci est une classe non statique qui est beeing appelé par:

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

Dans le TestClass() je charge avec un constructeur une nouvelle classe dans la classe parente.

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

Ensuite, je charge une méthode de classe appelée test() avec la ligne suivante:

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

Cette méthode récupère alors les arguments de la fonction avec: func_get_args() et transmet tous les arguments avec forward_static_call_array()

Comme suit:

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

Appeler par:

  • SubClass :: callme

fait une classe statique. Et logiquement, je reçois un message d'erreur:

normes strictes: forward_static_call_array() attend le paramètre 1 pour être un rappel valide, méthode non statique SubClass :: callme() ne doit pas être appelée de façon statique dans N: \ wamp \ www \ test \ forward_arguments \ testclass.php sur la ligne 15

2 SubClass

Le subClass récupère les arguments comme suit:

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

Maintenant, avec cette configuration, l'avis d'erreur est logique. Et la variable classe TestClass

private $obj    = NULL; 

get complètement évité.

$this->obj = new SubClass();  

Le problème spécifique

La ligne de problème est celui-ci:

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

La syntaxe doit être différente. Mais je n'ai aucune idée de comment. Merci d'avance!

Edit:

Le problème est que je ne sais comment appeler des méthodes statiques de classe. Mais je ne sais pas comment appeler une méthode dans une classe chargée.

Solution

(fourni par: 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

Que penseriez-vous en tant que sortie et quel est votre sortie courant? De plus, vous n'avez aucune fonction statique dans vos classes! – Rizier123

+0

Je sais. Et je veux utiliser la variable de classe $ obj Donc, il devrait être 'forward_static_call_array ('$ this-> obj-> callMe', func_get_args());' Mais cela ne fonctionne pas: -o –

Répondre

2

Je pense que vous voulez changer ceci:

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

à:

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

Et vous devez également déclarer votre méthode statique, par exemple:

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

Cela fonctionne! Merci!! Ajout du code de travail complet dans la question. De plus, j'ai ajouté quelques options supplémentaires pour prouver le fonctionnement du concept. –

+0

Comment sommes-nous censés traiter les cas exotiques où le nom de classe est généré dynamiquement? (ie: le nom de la classe est une chaîne contenue dans une variable chaîne) – FMaz008

+0

@ FMaz008 Comme dans l'exemple '$ this-> obj' contiendrait le nom de la classe. – Rizier123