最近我开始学习Laravel,它是一个非常好的PHP框架。目前,我正在尝试使我自己的MVC类似于Laravel的工作方式。
我的逻辑
我们设置路由,然后检查当前URL是否存在,从那里我们将从'uses'
设置控制器和方法,如果不存在,我们将控制器设置为ERROR
。问题是我无法访问$routes变量。
如果我尝试static::$routes = ..
,php会显示一个错误,但Lavarel工作正常,尽管我的php版本是5.2。我不明白整个过程是如何工作的。此外,如果您对如何构建架构有任何建议:)
index.php
include 'router.php';
include 'route.php';
Route::get('about',array('uses'=> 'about@index'));
Route::get('about2',array('uses'=> 'about@index'));
router.php
class Router {
public static $routes = array(
'GET' => array(),
'POST' => array(),
'PUT' => array(),
'DELETE' => array(),
'PATCH' => array(),
'HEAD' => array(),
);
public $valid = false;
public static $methods = array('GET', 'POST', 'PUT', 'DELETE', 'HEAD');
public static function register($method, $route, $action)
{
if (ctype_digit($route)) $route = "({$route})";
if (is_string($route)) $route = explode(', ', $route);
foreach ((array) $route as $uri){
if (is_array($action)){
$routes[$method][$uri] = $action;
}
}
$request = $_SERVER['REQUEST_URI'];
$request = trim($request, '/');
$exist = array_key_exists($request, $routes[$method]);
if($exist){
$valid = true;
}
echo $valid;
// print_r($routes);
}
}
route.php
class Route {
public static function get($route, $action)
{
Router::register('GET', $route, $action);
}
}
如果您计划复制和粘贴作品,请先了解整个过程,然后再假设一切都是静态的,请阅读:
- 工厂方法模式
- 立面图案
- 多吨模式
这是因为您只使用局部变量。在处理类时,对象变量通过$this->
访问,而静态变量则通过self::
或static::
访问。
http://codepad.org/F7UWmOSb
class Foo
{
protected static $bar = 'lorem';
protected $buz = 'ipsum';
public function test()
{
var_dump( $this->buz );
var_dump( self::$bar );
}
}
$instance = new Foo;
$instance->test();
此外,正如@PeeHaa所提到的:停止使用静态变量。这不是OOP。静态结构只是封装在名称空间中的全局变量/函数,恰好看起来像class
定义。
学习依赖注入,这些讲座可能会有所帮助:
- 遗传,多态性,&测试
- 全球状态与辛格尔顿
- 不要找东西
- 单元测试