`
tomyjohn
  • 浏览: 7712 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

php框架开发二(SPL库和controller)

 
阅读更多

根据上话的目录结构(如果不清楚的可以看上一篇)。我在simple文件夹内新建了一个simple.php.

require 'includes/exceptions.php'; require 'includes/autoloader.php'; session_start();

//$view = new view(); lib::set_item('controller' , new controller()); lib::get_item('controller' , lib::PERSIST_STORGE)->render(); //$content = $view->finish();

这一章主要是讲SPL,所以我们只看第二行的autoloader.php.当我们在index.php中加入

require 'simple/simple.php';

之后。

我们看一下autoloader.php的源码

<?php
class autoloader{
	
	public static function includesautoloader($class){
		$path = defined('SIMPLE_PATH') ? SIMPLE_PATH : $_SERVER['DOCUMENT_ROOT'];
		$file_name = $path . '/includes/' . $class . '.php';
		if(is_readable($file_name))
			require $file_name;
	}
	
	public static function modulesautoloader($class){
		$path = defined('SIMPLE_PATH') ? SIMPLE_PATH : $_SERVER['DOCUMENT_ROOT'];
		$file_name = $path . '/modules/' . $class . '.php';
		if(is_readable($file_name))
			require $file_name;
	}
	
	public static function controllerautoloader($class){
		$path = defined('SIMPLE_PATH') ? SIMPLE_PATH : $_SERVER['DOCUMENT_ROOT'];
		$file_name = $path . '/controller/' . $class . '.php';
		if(is_readable($file_name))
			require $file_name;
	}

}

spl_autoload_register('autoloader::includesautoloader');
spl_autoload_register('autoloader::modulesautoloader');
spl_autoload_register('autoloader::controllerautoloader');


这个类都是静态方法,当引用这个PHP文件后,程序会自动载入这三个文件夹下的内容,这样我们不用重复去required 或include。如果对SPL有不了解的,可以直接去百度,这里只是告诉大家,这个SPL作用相当广。

然后在includes文件夹内新建一个lib.php

<?php
class lib{
	
	const SETTING_ARRAY = true;
	const PERSIST_STORGE = false;
	
	public static function set_item($name , $value , $is_array = false){
		if($is_array){
			$_SESSION[$name]   = array();
			$_SESSION[$name][] = $value;
		}
		else{
			$_SESSION[$name] = $value;
		}
	}
	
	public static function get_item($name , $persist = true){
		$result = null;
		if(isset($_SESSION[$name])){
			$result = $_SESSION[$name];
		}
		if(!$persist){
			unset($_SESSION[$name]);
		}
		return $result;
	}
	
	public static function sendto($url = ''){
		if(empty($url)){
			$url  = '/';
		}
		die(header('Location:' . $url));
	}
}

这个类目前只用于设置SESSION相关的内容。

当执行到lib::set_item('controller' , new controller());时,这里新建了一个控制器对象,并对象存入SESSION中。

controller.php

<?php
class controller{
	//URL部分
	protected $parts;
	//方法参数
	protected $params;
	
	public function __construct(){
		$this->parts = array();
		$this->analysis();
	}
	
	public function analysis(){
		$path_info = $_SERVER['PATH_INFO'];
		if(substr($path_info , 0 , 1) == '/'){
			$path_info = substr($path_info , 1);
		}
		$parts = explode('/' , $path_info);
		if(empty($parts[0]))  $parts[0] = 'index';
		if(empty($parts[1]))  $parts[1] = 'demo';
		
		$this->parts = $parts;
		array_shift($parts);
		array_shift($parts);
		$this->params = $parts;
	}
	
	public function render(){
		if(!class_exists($this->parts[0])){
			throw new ControllerDoesntExistsException($this->parts[0] . ' not exists!');
		}
		if(!method_exists($this->parts[0] , $this->parts[1])){
			throw new ActionDoesntExistsException($this->parts[0] . 'of ' . $this->parts[1] . ' not exists!');
		}
		
		$new_controller = new $this->parts[0];
		$called = call_user_func_array(array($new_controller , $this->parts[1]) , $this->params);
		if($called === false){
			throw new ActionFailedException($this->parts[0] . 'of ' . $this->parts[1] . ' failed to excute property!');
		}
	}
}


这个类只用PATH_INFO模式来获取调用的控制器和ACTION,并将参数传递到相应的ACTION方法里。当controller初始化之后,会自动分析PATH_INFO的内容,

lib::get_item('controller' , lib::PERSIST_STORGE)->render();

然后调用render()就会在相应的控制器目录找到控制器和ACTION。

例如我在controller文件夹内新建一个index.php

<?php
class index{
	
	public function demo(){
		echo "sdfsdf";
	}
}

那么执行http://localhost/index.php/index/demo就会输出"sdfsdf";(这是我的本地路径)。

以上代码难度不高,如果没有看懂的同学,请Q我,也可以去PHP官网上去查找相应函数的用法。

下一节相会对视图作一个简单的介绍。

分享到:
评论

相关推荐

    SPL框架/.net框架

    1.SPL框架/.net框架 2.操作数据库层 3.持久层 4.适合.net winfrom开发 5.带有公共类库等

    PHP高级程序设计-模式-框架-测试

    抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP 开发人员最有可能用到的MVC 模式,...

    php的spl库基本使用

    NULL 博文链接:https://wsluozefeng.iteye.com/blog/2222032

    《PHP高级程序设计_模式、框架与测试》中文版PDF

    书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和php 6的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准php库spl方面的知识以及php开发人员...

    PHP高级程序设计_模式、框架与测试

    第三部分 SPL(标准PHP库)  第9章 SPL简介  第10章 SPL迭代器  第11章 SPL文件和目录处理  第12章 SPL数组重载  第13章 SPL异常 第四部分 MVC模式  第14章 MVC架构  第15章 Zend框架简介  第16章...

    PHP SPL手册 CHM版

    权威详细的PHP SPL (Standard PHP Library)学习手册,很好,很实用,很值得一看!

    PHP高级程序设计_模式、框架与测试 PDF及源码

    测试、部署和持续集成 第三部分 SPL(标准PHP库) 第9章 SPL简介 第10章 SPL迭代器 第11章 SPL文件和目录处理 第12章 SPL数组重载 第13章 SPL异常 第四部分 MVC模式 第14章 MVC架构 第15章 Zend框架简介 第16章 Zend...

    听棠的.net持久化框架SPL3.2版

    目前在网络上大家可以找到好几种持久层,其实各个持久层的思想都是相同的,只是在实现的方式上,还有一些细节功能上有差异,每个持久层都有独特之处或是不足之处,这本身是一个发展过程,SPL也不例外,同样希望有...

    PHP高级程序设计SPL

    PHP高级程序设计_模式、框架与测试PHP遗失的珍宝SPL

    听棠的spl持久化框架实体类自动生成器

    听棠的spl持久化框架实体类自动生成器,挺好用的

    PHP的SPL扩展基础学习.docx

    是对php的扩展SPL的简单特性学习,以及他的使用场景介绍

    spl:PHP SPL-标准PHP库

    PHP SPL-标准PHP库在的讨论中,我们发现由于对SPL自身存在的了解不足,因此对SPL的接受度较低。 PHP SPL系列的目的-标准PHP库旨在尝试解决此问题,向每个SPL参与者展示其含义,用途以及使用方法。

    PHP标准库(PHP SPL)详解

    SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。 似乎众多的 PHP 开发人员基本没有使用它...

    听棠的SPL2.0持久化框架

    目前在网络上大家可以找到好几种持久层,其实各个持久层的思想都是相同的,只是在实现的方式上,还有一些细节功能上有差异,每个持久层都有独特之处或是不足之处,这本身是一个发展过程,SPL也不例外,我同样希望有...

    SPL气压计芯片手册

    英飞凌SPL06-001手册,便于开发市场上价格比BMP280和MS5611都便宜

    spl06使用代码.zip

    spl06使用

    PHP SPL标准库中的常用函数介绍

    主要介绍了PHP SPL标准库中的常用函数介绍,本文着重讲解了spl_autoload_extensions()、spl_autoload_register()、spl_autoload()三个函数,需要的朋友可以参考下

    Linux_SPL-PUB_开发指南1

    前言1.1 编写目的 .1.2 适用范围 .1.3 相关人员 .1.4 术语、定义、缩略语 .编译方法介绍.......5.1.1 a100,a133,b810

    SPL使用说明

    SPL最大的特点是实用. 我感觉tintown设计SPL的时候,完全是从实用角度出发,所以SPL的易用性极高,只需要很少的配置... 所以在开发过程中,SPL能将DataAccess层的代码量减少到最低限度. 这点在我做过的项目中已经得到验证.

Global site tag (gtag.js) - Google Analytics