【发布时间】:2010-08-04 21:47:10
【问题描述】:
总的来说,我对 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;
}
}
}
基本上,当我创建一个新的 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';
}
}
}
【问题讨论】:
-
你还没有展示 Ebay 类的定义——它肯定扩展了 BuildLinks 吗?
-
另外,父类 BuildLinks 似乎没有affiliate_link() 方法...?
-
是的,Ebay 类扩展了 BuildLinks。你是对的,它没有affiliate_link() 方法。我调用 build_thelink() 从子类返回链接。我已经编辑了我的帖子以包含我的 ebay 子类