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';
}
}
}
Vous ne l'avez pas montré la définition de la classe Ebay - t-il vraiment prolonger BuildLinks? –
En outre, la classe parente BuildLinks ne semble pas avoir une méthode affiliate_link() ...? –
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