01/10/2018, 00:35

[Hỏi HĐT PHP] Biến $this trong php và mô hình MVC

Chào các bạn,
Mình download trên mạng một mô hình MVC về kham khảo thì có 1 file được dùng như hình


Mình đã coi hết file trong thư mục nhưng tác giả không khai báo biến view hay js css gì hết nhưng sao lại sử dụng được,

Trong đó hàm __init() trong session là :

public static function __init(){
	session_start();
}

và class View là

<?php
class View{
	public function __construct(){
    }
	public function render($link,$Noinclude=""){
		if($Noinclude==""){
			require_once __TEMPLATES_PATH."header.php";
			echo "<div id='conten'>";
				require(__VIEW_PATH.$link.".php");
			echo"</div>";
			require_once __TEMPLATES_PATH."footer.php";
		}else{
			require(__VIEW_PATH.$link.".php");
		}
	}
	public function redirect($link='){
		ob_start();
		if($link!='){
		$link=__SITE_PATH.$link;
		}else{
		$link=__SITE_PATH;
		}
		header("Location:$link");
	}
}
?>

Cảm ơn,

Quân viết 02:44 ngày 01/10/2018

không khai báo view nhưng chắc có dùng magic method __get __set, và hơn hết code MVC bạn lấy từ đâu, nên dẫn nguồn và full code của class Controller

Pete Houston viết 02:43 ngày 01/10/2018

Mình đã coi hết file trong thư mục nhưng tác giả không khai báo biến view hay js css gì hết nhưng sao lại sử dụng được,

PHP cơ bản nhé. Trong PHP, không cần thiết phải khai báo thuộc tính mới có thể sử dụng được, dùng thoải mái vô tư.

class AnyClass {
    public function random() {
        $this->value = 100;
    }

    public function getValue() {
         return $this->value;
    } 
}

$wow = new AnyClass;
$wow->random();
echo $wow->getValue(); // 100

Mặc dù làm được thế này nhưng không nên dùng, nó là một bad practice. Tương lai PHP sẽ tìm cách bỏ chức năng này.

Hiếu Từ viết 02:40 ngày 01/10/2018

Mình mới tìm lại được http://hocphp.info/mo-hinh-mvc/
full code Controller
<?php class Controller { public function __construct(){ Session::__init(); $this->view=new View; $this->view->js=array("default","jquery"); $this->view->css=array("default"); } public function LoadModel($name){ $path=__MODEL_PATH.$name."_Model.php"; if(file_exists($path)){ require_once($path); $name=$name."_Model"; $this->model=new $name; } } } ?>

Quân viết 02:48 ngày 01/10/2018

ok, thực tế thì php có 1 cái gọi là dynamic properties, tức là bạn có thể tạo thêm properties cho 1 object của 1 class mà k cần khai báo biến trước. Do đó bạn k thấy chỗ khai báo biến $view là phải, ngay khi $this->view = … thì biến view đã tự động add vào this, chính là chính object đó, nhưng bạn k nên làm thế nếu có thể, hãy dùng magic method __get __set

Bài liên quan
0