对象不显示

时间:2014-06-12 10:55:43

标签: php

我正在尝试使用此代码并执行echo $model->string;因为$string受到保护,所以不应该做任何事情。

但是,为什么echo $view->output();也不做任何事情?它应该打印'asd'作为一个链接。另一个有趣的事实是,如果我将这行代码置于另一行代码之上,它将起作用。

为什么我会得到一个空白页面,否则?     

class Model
{
    protected $string;

    public function __construct(){
        $this->string = "asd";
    }

}


class Controller extends Model
{
    private $model;

    public function __construct($model){
        $this->model = $model;
    }
    public function get() {
        return $this->model->string;
    }
    public function clicked() {
        $this->model->string = "asadasdasdas";
    }
}
class View
{
    private $model;
    private $controller;

    public function __construct($controller,$model) {
        $this->controller = $controller;
        $this->model = $model;
    }


    public function output() {
        return '<p><a href="mvc.php?action=clicked">' . $this->controller->get() . '</a></p>';
    }
}

$model = new Model();
$controller = new Controller($model);
$view = new View($controller, $model);

if (isset($_GET['action']) && !empty($_GET['action'])) {
    $controller->{$_GET['action']}();
}

echo $model->string;
echo $view->output();


?>

4 个答案:

答案 0 :(得分:0)

因为它确实受到了保护。 $ this-&gt; model-&gt; string(在函数get()中)也无法获取它。

当您将Model作为参数插入Controller的构造函数时,也可能无法从Model扩展Controller。

实际可行的是

public function get() {
    return $this->string;
}

因为Controller从Model扩展并拥有自己的$ string。但我想这不是你想要的,因为它会打败你的

$model = new Model();
$controller = new Controller($model);

方法

答案 1 :(得分:0)

因为您受到保护的是protected而不是private。 您将受保护的值分配给私有值,另一个私有值并使用公共函数显示:

public function() -> private $controller -> private $model -> protected $string;

因为你将之前的课程归还给新课程,'权限系统'并不像你期望的那样工作。

更好的是扩展类,我想你会得到预期的结果。

答案 2 :(得分:0)

这是一个工作示例。但这不是真正的MVC你在那里做什么..

但是..通过让Controller扩展Model类,您可以在控制器中使用Model类的方法。但不是受保护的财产。

<?php
class Model
{
    protected $string;

    public function __construct(){
        $this->string = "asd";
    }
    public function getString() {
        return $this->string;
    }


}


class Controller extends Model
{
}

class View
{
    private $controller;

    public function __construct($controller) {
        $this->controller = $controller;
    }


    public function output() {
        return '<p><a href="mvc.php?action=clicked">' . $this->controller->getString() . '</a></p>';
    }
}



$x = new Controller();
$y = new View($x);
echo $y->output();

答案 3 :(得分:-1)

你已经将变量声明为string,它被php解析为变量类型(如int,float)。

如果你将字符串变量转换为$ string2,它将起作用

结帐这件事:

 class Model
{
    protected $string2;

    public function __construct(){
        $this->string2 = "asd";
    }

}


class Controller extends Model
{
    private $model;

    public function __construct($model){
        $this->model = $model;
    }
    public function get() {
        return $this->model->string2;
    }
    public function clicked() {
        $this->model->string2 = "asadasdasdas";
    }
}
class View
{
    private $model;
    private $controller;

    public function __construct($controller,$model) {
        $this->controller = $controller;
        $this->model = $model;
    }


    public function output() {
        return '<p><a href="mvc.php?action=clicked">' . $this->controller->get() . '</a></p>';
    }
}

$model = new Model();
$controller = new Controller($model);
$view = new View($controller, $model);

if (isset($_GET['action']) && !empty($_GET['action'])) {
    $controller->{$_GET['action']}();
}

//echo $model->string2;
echo $view->output();