假设我有以下php类:类用户,类文件管理器和类下载器扩展文件管理器
<?php
class user {
private $name;
public function __construct($name){
$this->_name = $name;
}
public function getName(){
return $this->_name;
}
}
class fileManager {
protected $user, $list;
public function __construct($user, $list){
$this->_user = $user;
/* IF list is 1 OR 2... */
$this->_list = $list
/* for test: */
echo $this->user->getName(); /* WORKS */
}
/* SOME METHODS */
}
class downloader extends fileManager {
public function download($fileid){
$this->_fileid = $fileid;
/* if his username is set, he is logged in */
if($this->user->getName()!=null){continue();}
}
}
$user = new user('Jan');
echo $user->getName(); /* = jan */
$fm = new fileManager($user, 1);
$down = new downloader();
$down->download(1);
/* FATAL ERROR, Call to a member function getName() on a non-object */
?>
因此,jan 已登录,并打开文件管理器。文件管理器从用户类调用 getName,并知道它是 jan。但是,如果 Jan 想要下载文件 1,则下载程序无法识别 Jan。子类不应该从父类继承属性吗?
$down是一个
新对象。 -> 构造函数需要参数。尝试
$user = new user('Jan');
echo $user->getName(); /* = jan */
$fm = new fileManager($user, 1);
$down = new downloader($user, 1);
$down->download(1);
不考虑拼写错误,您必须在实例化下载类时将值传递给构造函数。
class user {
private $name;
public function __construct($name){
$this->_name = $name;
}
public function getName(){
return $this->_name;
}
}
class fileManager {
protected $user, $list;
public function __construct($user, $list){
$this->_user = $user;
/* IF list is 1 OR 2... */
$this->_list = $list;
/* for test: */
echo $this->_user->getName(); /* WORKS */
}
/* SOME METHODS */
}
class downloader extends fileManager {
public function download($fileid){
$this->_fileid = $fileid;
/* if his username is set, he is logged in */
if($this->_user->getName()==null)
return false;
//download file
}
}
$user = new user('Jan');
echo $user->getName(); /* = jan */
$fm = new fileManager($user, 1);
$down = new downloader($user, 1);
$down->download(1);