PHP子类can';t访问父级设置的公共变量

PHP子类can';t访问父级设置的公共变量,php,oop,scope,subclass,Php,Oop,Scope,Subclass,一般来说,我对PHP和OOP非常陌生。我正在使用codeigniter作为一个框架,目前正在尝试构建一个类“BuildLinks”,它将根据用户登陆的URL将用户重定向到正确的链接 控制器将正确的变量传递给类,而函数build_afflink()则根据var1选择下一步要调用的类 控制员: function out($var1, $var2) { // redirect to link after parsing data $debug='1'; $params

一般来说,我对PHP和OOP非常陌生。我正在使用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;
        }

    }
}
以下工作很好:

$newobj = new Amazon;
return $newobj->affiliate_link();
这不是,但类几乎是相同的

$newobj = new Ebay;
return $newobj->affiliate_link();
以下是易趣课程:

  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';
        }
    }
}
class易趣扩展了BuildLinks
{
私人$res;
//TODO:语言/多站点支持
//公共场所;
函数_u构造()
{
//echo _uuclass_uuuu.'loaded…..''vendor:'.$this->vendor.'isbn:'.$this->isbn.
; } 函数add_to_cart_按钮($isbn,$locale) { } 功能附属链接() { $this->get_info(); 返回$this->link; } //加载$this->api_call()并返回Amazon SimpleXML响应对象,加载变量 函数get_info() { $apicall=$this->api_call(); //构建变量 foreach($apicall->searchResult->item as$item){ $this->link=(字符串)$item->viewItemURL; } } //生成API调用并返回simplexml对象$res 函数api_call() { //在这里创建$apicall $res=simplexml\u load\u文件($apicall); //检查请求是否成功,否则打印错误 如果($res->ack==“成功”){ $this->res=$res; 返回$res; }否则{ 回显“api_调用()不成功”; } } }
Ebay::get_info()执行此操作

foreach ($apicall->searchResult->item as $item) {
  $this->link = (string )$item->viewItemURL;
}
如果
$apicall->searchResult->item
碰巧有几个元素,其中最后一个元素是空的,那么您将只得到最后一个空元素

这是一个疯狂的猜测

[补充]


您正在覆盖易趣中的构造函数,因此如果希望调用BuildLinks的类构造函数,则需要显式执行此操作。

易趣类的这一部分对我来说意义不大:

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\u加载文件($apicall)没有加载任何内容。
$apicall
在哪里?如果您调试它,它是否回显“api_call()unsuccessful”

因为如果不成功,则不会设置
Ebay::link
,因此
return$newobj->affiliate_link()最终不会返回任何内容


为澄清起见,
$apicall
应在调用
simplexml\u load\u file($apicall)之前设置为文件路径

您尚未显示易趣类的定义-它确实扩展了BuildLinks吗?此外,父类BuildLinks似乎没有附属链接()方法…?是的,易趣类扩展了BuildLinks。你说得对,它没有附属链接()方法。我调用build_thelink(),它返回子类的链接。我已经编辑了我的帖子以包含我的易趣子类。当易趣类由BuildLinks::build\u thelink()加载时,我将易趣的构造函数设置为echo$this->var1和$this->var2。这两个都是空的——因此在它到达Ebay::get_info()之前就出现了问题。您的构造函数是否调用父类的构造函数?如果将构造函数设置为调用父类::_construct();,我从控制器传递到父级的$params数组不可用于引用。奇怪的是,Amazon类由于某种原因能够访问var1和var2。这在Amazon::api_call()中运行良好--$res=$pas->item_search('$This->var2',array('ResponseGroup'=>'Large');哦,我明白你的意思了。我如何将变量从CI控制器传递到我的类构造函数中,以便为每个子类构造/提供它们?可能需要重新考虑类依赖关系。如果父类不能在与扩展类相同的上下文中使用,这违反了我在这里没有包含整个函数的规定——在我的函数中,$apicall变量是在simplexml_load_file($apicall)之前构造的;被称为。api调用工作得很好,但我必须硬编码一个字符串,其中包含我想要的$this->var2。这就是问题所在——子类Ebay不能引用父类设置的任何变量查看Mchl的构造函数建议。此外,我注意到,有时如果显式地公开成员/方法,它也会隐式地使其成为静态的。任何可以使用$BuildLinks::var2访问它们的机会(尽管这是一种猜测…)。谢谢你的建议,但我还没有解决这个问题:/
foreach ($apicall->searchResult->item as $item) {
  $this->link = (string )$item->viewItemURL;
}
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';
        }
    }