2010-08-04 7 views
0

Je suis très novice en PHP et OOP en général. J'utilise codeigniter pour un framework, et j'essaye actuellement de construire une classe 'BuildLinks' qui redirigera l'utilisateur vers le bon lien en fonction de l'URL sur laquelle ils ont atterri.La sous-classe PHP ne peut pas accéder à la variable publique définie par le parent

Le contrôleur passe les bonnes variables à la classe, alors que le build_afflink() fonction sélectionne quelle classe d'appeler suivant basé sur le var1

Le contrôleur:

function out($var1, $var2) 
{ 
    // redirect to link after parsing data 
    $debug='1'; 
    $params = array('var1'=>$var1, 'var2'=>$var2); 
    $this->load->library('BuildLinks', $params); 
    if ($debug=='0'){ 
     $redirect = $this->buildlinks->build_afflink(); 
     redirect($redirect, 'location', 301); 
    } 
    else { 
     var_dump($this->buildlinks->build_afflink()); 
    } 

} 

La classe BuildLinks est une œuvre en cours ... mais il est étendu par tous les autres sites que je dois soutenir.

classe BuildLinks:

class BuildLinks 
{ 
    public $var1; 
    public $var2; 
    public $link; 
    function __construct($params) 
    { 
     //populate up inititial variables from $params array (passed from controller) 
     $this->var1 = (string)$params['var1']; 
     $this->var2 = (string)$params['var2']; 
     echo __class__ . ' loaded....' . 'var1: '.$this->var1 . ' var2: ' .$this->var2. '<br/>'; 

    } 
    public function get_var1() 
    { 
     return $this->var1; 
    } 

    public function set_var1($var1) 
    { 
     $this->var1 = $var1; 
    } 

    public function get_var2() 
    { 
     return $this->var2; 
    } 

    public function set_var2($var2) 
    { 
     $this->var2 = $var2; 
    } 


    function build_thelink() 
    { 
     switch ($this->var1) { 
      case 'amazon': 
       //echo 'Amazon is our vendor.<br>'; 
       $newobj = new Amazon; 
// Amazon subclass returns the correct affiliate link 

       return $newobj->affiliate_link(); 
       break; 
      case 'ebay': 
       $newobj = new Ebay; 
     //ebay subclass however, cannot access the public var var1, it returns a null value for $this->var1 
       return $newobj->affiliate_link(); 
       break; 
     } 

    } 
} 

Essentiellement, quand je fais un nouvel objet Ebay, il ne peut pas accéder à l'une des variables publiques des BuildLinks de classe parente. Qu'est-ce que je fais mal?

Dans cet exemple, je lui ai construit les variables initiales et renvoyé certaines informations pour le débogage.

EDIT: Si je change le __construct lire:

function __construct($params) 
    { 
     //populate up inititial variables from $params array (passed from controller) 
     $this->var1 = (string)$params['var1']; 
     $this->var2 = (string)$params['var2']; 
     echo __class__ . ' loaded....' . 'var1: '.$this->var1. ' var2: ' .$this->var2 . '<br/>'; 
     var_dump(get_class_vars(get_class($this))); 
} 

Puis-je obtenir cela comme une sortie:

BuildLinks loaded....var1: ebay var2: somedata 

array 
    'var1' => null 
    'var2' => null 
    'link' => null 

Ce qui suit fonctionne très bien:

$newobj = new Amazon; 
return $newobj->affiliate_link(); 

Ce n'est pas le cas, mais les classes sont presque identiques ...

$newobj = new Ebay; 
return $newobj->affiliate_link(); 

Voici la classe ebay:

class Ebay extends BuildLinks 
{ 
    private $res; 
    //TODO: language/multiple site support 
    //public $locale; 
    function __construct() 
    { 
     //echo __class__ . ' loaded....' . 'vendor: '.$this->vendor . ' isbn: ' .$this->isbn . '<br/>';    
    } 

    function add_to_cart_button($isbn, $locale) 
    { 
    } 
    function affiliate_link() 
    { 
     $this->get_info(); 
     return $this->link; 
    } 
    // Load $this->api_call() and return Amazon SimpleXML response object, load variables 
    function get_info() 
    { 
     $apicall = $this->api_call(); 
     //build variables 
     foreach ($apicall->searchResult->item as $item) { 
     $this->link = (string)$item->viewItemURL; 
     } 
    } 

    // Generate API call and return simplexml object $res 
    function api_call() 
    { 
     //build $apicall here 
     $res = simplexml_load_file($apicall); 

     // Check to see if the request was successful, else print an error 
     if ($res->ack == "Success") { 
      $this->res = $res; 
      return $res; 
     } else { 
      echo 'api_call() unsuccessful'; 
     } 
    } 
} 
+2

Vous ne l'avez pas montré la définition de la classe Ebay - t-il vraiment prolonger BuildLinks? –

+1

En outre, la classe parente BuildLinks ne semble pas avoir une méthode affiliate_link() ...? –

+0

Oui, la classe Ebay étend BuildLinks. Vous avez raison, il n'a pas de méthode affiliate_link(). J'appelle build_thelink() qui retourne le lien des sous-classes. J'ai édité mon post pour inclure ma sous-classe ebay – timelf123

Répondre

0

Ebay :: get_info() Est-ce

foreach ($apicall->searchResult->item as $item) { 
    $this->link = (string)$item->viewItemURL; 
} 

Si $apicall->searchResult->item arrive à avoir plusieurs éléments, dont la dernière est vide, vous Je n'aurai que ce dernier élément vide.

C'est une supposition sauvage cependant.

[ajouté]

Vous écrasez un constructeur dans Ebay, donc si vous voulez que le constructeur de la classe de BuildLinks à appeler, vous devez le faire explicitement.

+0

Lorsque la classe ebay est chargée par BuildLinks :: build_thelink(), je configure le constructeur de Ebay pour echo $ this-> var1 et $ this-> var2. Les deux sont vides - c'est donc un problème avant même qu'il ne parvienne à Ebay :: get_info() – timelf123

+2

Est-ce que votre constructeur appelle le constructeur de la classe parente? – Mchl

+0

Si le constructeur est appelé pour appeler parent :: __ construct() ;, le tableau $ params que je passe du contrôleur au parent n'est pas disponible pour le référencement. Ce qui est bizarre, c'est que la classe Amazon est en mesure d'accéder à la var1 et var2 pour une raison quelconque. Cela fonctionne bien dans Amazon :: api_call() - $ res = $ pas-> item_search ('$ this-> var2', array ('ResponseGroup' => 'Large')); – timelf123

0

Cette partie de la classe eBay ne fait pas trop de sens pour moi:

function api_call() 
    { 
     //build $apicall here 
     $res = simplexml_load_file($apicall); 

     // Check to see if the request was successful, else print an error 
     if ($res->ack == "Success") { 
      $this->res = $res; 
      return $res; 
     } else { 
      echo 'api_call() unsuccessful'; 
     } 
    } 

simplexml_load_file($apicall); spécifiquement ne se charge pas quoi que ce soit. Où est $apicall? Si vous déboguez cela, cela fait-il écho à "api_call() échoué"? Parce que si cela échoue, Ebay::link ne sera pas défini et par conséquent ne retournera rien.

des éclaircissements, $apicall doit être réglé sur un chemin de fichier avant d'appeler simplexml_load_file($apicall);

+0

Je n'ai pas inclus toute la fonction ici - dans ma fonction, le $ La variable apicall est construite avant simplexml_load_file ($ apicall); est appelé. L'appel api fonctionne très bien, mais j'ai dû coder en dur dans une chaîne où je voudrais que $ this-> var2 soit. C'est le problème ici - la sous-classe Ebay ne peut pas référencer l'une des variables définies par la classe parente – timelf123

+0

regardez la suggestion du constructeur de Mchl. De plus, j'ai remarqué que parfois, si vous rendez explicitement un membre/une méthode public, cela le rend implicitement statique. Toute chance de pouvoir y accéder avec $ BuildLinks :: var2 (c'est une sorte de conjecture, bien que ...). – Tim

+0

Merci pour votre suggestion, mais je n'ai pas encore réglé le problème:/ – timelf123

Questions connexes