Подкласс PHP не может получить доступ к публичной переменной, установленной родителем - PullRequest
0 голосов
/ 05 августа 2010

Я очень новичок в PHP и ООП в целом.Я использую codeigniter для фреймворка, и в настоящее время пытаюсь создать класс BuildLinks, который перенаправит пользователя на правильную ссылку в зависимости от того, по какому URL он попал.

Контроллер передает нужные переменные классу, в то время как функция build_afflink () выбирает, какой класс вызывать следующим, основываясь на var1

Контроллер:

    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());
    }

}

Класс BuildLinks находится в стадии разработки ... но он расширен всеми остальными сайтами, которые мне нужно поддерживать.

Класс 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;
        }

    }
}

По сути, когда я создаю новый объект Ebay, он не может получить доступ ни к одной из открытых переменных из родительского класса BuildLinks.Что я делаю не так?

В этом примере он создает начальные переменные и выводит некоторую информацию для отладки.

РЕДАКТИРОВАТЬ: Если я изменю__construct, чтобы читать:

    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)));
}

Тогда я получаю это в качестве вывода:

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

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

Следующее работает отлично:

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

Это не так, ноклассы почти идентичны ...

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

Вот класс 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 ]

0 голосов
/ 05 августа 2010

Эта часть класса ebay не имеет для меня особого смысла:

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); специально ничего не загружает.Где $apicall?Если вы отлаживаете, выводит ли это «api_call () unsuccessful»?

Потому что, если это не удастся, то Ebay::link не будет установлено, и в результате return $newobj->affiliate_link(); не будет ничего возвращать.

для пояснения, $apicall должен быть задан путь к файлу перед вызовом simplexml_load_file($apicall);

0 голосов
/ 05 августа 2010

Ebay :: get_info () делает это

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

Если в $apicall->searchResult->item окажется несколько элементов, последний из которых пуст, вы получите только этот последний пустой элемент.

Хотя это дикое предположение.

[добавлено]

Вы перезаписываете конструктор в Ebay, поэтому, если вы хотите, чтобы конструктор класса BuildLinks вызывался, вам нужно сделать это явно.

...