我对PHP继承有错误的想法吗?

时间:2013-01-31 04:00:03

标签: php oop

我正在尝试创建一个简单的示例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();
    }
}
?>

4 个答案:

答案 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();