我正在尝试使用此代码并执行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();
?>
答案 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();