我正在尝试创建一个简单的示例php脚本,有一个用户类,然后是两个控制器。
想象一下它是一个没有视图的MVC。
目前我无法让getUserId()
在showUserId()
usercontroller
内工作,我做错了什么?
PHP
<?
class user{
function getUserId(){
return 1; //Simple Example
}
}
class controller{
function __construct(){
$user = new User();
}
}
class usercontroller extends controller{
function __construct(){
$user = new User();
}
function showUserId() {
echo $user->getUserId();
}
}
?>
答案 0 :(得分:1)
$user
仅适用于__construct
范围。要在对象范围内可用,它必须作为成员绑定到对象:
$this->user = new User;
然后,您可以访问$this->user
。
还建议将此成员作为类定义的一部分包含在内,不仅为了清晰起见,还要设置正确的访问修饰符。
答案 1 :(得分:1)
class usercontroller extends controller{
private $user;
function __construct(){
$this->user = new User();
}
function showUserId() {
echo $this->user->getUserId();
}
}
您需要将$ user定义为控制器类的class属性,在构造函数中定义它,然后您可以在所有函数中使用它。
编辑;
是的,您可以在oarent中定义并在子构造函数中调用parent的构造函数,并使用它。
<?
class user{
function getUserId(){
return 1; //Simple Example
}
}
class controller{
protected $user;
function __construct(){
$this->user = new User();
}
}
class usercontroller extends controller{
function __construct(){
parent::__construct();
//$user = new User();
}
function showUserId() {
echo $this->user->getUserId();
}
}
$controller_instance = new usercontroller();
$controller_instance->showUserId();
?>
答案 2 :(得分:1)
在您的代码示例中,$ user作为__construct()函数中的局部变量存在。
如果您希望它成为该类的一部分,请首先使用该名称定义一个类属性,然后您可以使用$ this-&gt;来引用它。语法。
class usercontroller extends controller {
public $user;
function __construct(){
$this->user = new User();
}
function showUserId() {
echo $this->user->getUserId();
}
}
作为一个挑剔的旁注,您的“用户”类在您的代码示例中被定义为“用户”。我确定你打算那些匹配,因为你没有询问你的脚本解析错误。
答案 3 :(得分:1)
我会从$user
中取出controller
变量,因为我觉得它并不属于那里:
class controller
{
}
然后,在usercontroller
内部,我将用户对象作为依赖项传递:
class usercontroller extends controller
{
private $user;
function __construct(User $user)
{
$this->user = $user;
}
public function showUserId()
{
echo $this->user->getUserId();
}
}
$c = new usercontroller(new User());
echo $c->showUserId();