欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

200行描述MVC

程序员文章站 2024-01-10 10:03:10
...
200行大点,读完kohana总结的一点笔记。
<?php
    header('Content-type: text/html; charset=utf-8');
        
    define('',str_replace('\\','/', __DIR__ ));
    //set_exception_handler(array("Factory","last_fun")); 设置一个用户定义的异常处理函数  
    Factory::getIns($_SERVER['REQUEST_URI']);
    abstract class ProductInterface
    {
        public $data=array();  //用于接收传过来的内容 
        public static $magic_quotes =NULL;
        public function __construct()
        {
            self::$magic_quotes = (version_compare(PHP_VERSION, '5.4') < 0 AND get_magic_quotes_gpc());
            // 清洁所有请求变量
            $_GET    = self::sanitize($_GET);
            $_POST   = self::sanitize($_POST);
            $_COOKIE = self::sanitize($_COOKIE);
        }
       
        public static function sanitize($value)
        {
            if (is_array($value) OR is_object($value))  {
                foreach ($value as $key => $val)  { 
                    $value[$key] = self::sanitize($val);
                }
            } elseif (is_string($value)) { 
                if (self::$magic_quotes === TRUE) { 
                    $value = stripslashes($value);
                }  
                if (strpos($value, "\r") !== FALSE) {
                    $value = str_replace(array("\r\n", "\r"), "\n", $value);
                }
            } 
            return $value;
        }
        
        public function __set($k,$v)
        {
            $this->$k = $v;
        }
        
        public function __call($method,$arg)
        {
             echo '错误指定页面';
             print_r($arg); //错误指定页面
        } 
        
        public static function __callStatic($method,$arg)
        {
             print_r($arg);  //错误指定页面 静态的好像不太可能 先写这儿了
        }
        
        public function assign($key,$value)
        {
            $this->data[$key] = $value;
        }
        
        //引入模板
        public function display($template,$ext = '.html')
        {
            $template_path = $template.$ext;
            if(file_exists($template_path)){
              foreach ($this->data as $k=>$v){
                $this->__set($k,$v);
              }
               include $template_path;
            }
        }
    }
  
  
  
//控制器
    class IndexAction extends ProductInterface
    {
        public function index()
        { 
            print_r( $_GET); 
           //$body = file_get_contents('php://input'); 
           //print_r($body);  //结果为  member_id=1234567    enctype="multipart/form-data"
          // print_r($_POST); //结果为  Array ( [member_id] => 1234567 )  
           

		   //$model= new Article('article');
           // $arr= $model->select('SELECT * FROM article limit 2');
         
		 //print_r($arr);
        }
            
        public function admin($array)
        {
           $model= new Article('article'); 
           $array=array();
           $array['rec']='admins';
           $array['pos']='李斯';
           $array['content']='hellow world'; 
           echo  $model->add($array);
        }
    } 
    
///控制器2
    class AdminAction extends ProductInterface
    {
        public function index($array)
        { 
          echo __method__.'方法';
        }
    }
  
  
    class Factory
    {
        protected static $ins=null; 
        protected  function __construct(){
           ob_start(); //打开缓冲区  
           static::autoLoad();  
           register_shutdown_function(array('Factory','last')); //程序执行完后执行 
        }
        
        public static function getIns($url){
            if(self::$ins instanceof self ){
               self::$ins->execute($url); 
           }else{
              self::$ins = new self();
              self::$ins->execute($url); 
           } 
        }
 
        protected function set_router($uri) {
/* 
        $uri='index/admin';  
       // $route_regex='#^(?:(?P[^/.,;?\n]++)(?:/(?P[^/.,;?\n]++)(?:/(?P[^/.,;?\n]++))?)?)?$#uD';
         //$route_regex='#^captcha(?:/(?P[^/.,;?\n]++))?$#uD';  
        $route_regex='#^(?:(?P[^/.,;?\n]++)(?:/(?P[^/.,;?\n]++)(?:/(?P[^/.,;?\n]++))?)?)?$#uD';
        if ( ! preg_match($route_regex, $uri, $matches)) {
            echo '没有匹配上';
        } else {
            print_r($matches);
        }
*/
              $arr=array();   
              if (strpos($uri,'?') === false) {
                   $pathinfo=array();
                   
                   if (!empty($_SERVER['PATH_INFO'])) {
                      $arg=trim($_SERVER['PATH_INFO'],'/');
                   } else if ($request_uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)){
                      //有效的URL路径发现,设置它。 
                      $arg= trim($request_uri,'/'); 
                   } 
                  if(stripos($arg,'/') !== false) {
                     $pathinfo=explode('/',$arg);
                  }
                  $arr['ctrolloer']= isset($pathinfo[0])? $pathinfo[0] : 'index' ;
                  array_shift($pathinfo);
                  $arr['action']= isset($pathinfo[0])?$pathinfo[0]:'index' ;
                  array_shift($pathinfo);
                  $num=count($pathinfo);
                  for ($i=0;$iset_router($url);
            $_GET =  isset($arr['param']) ? $arr['param'] : array();
            $ProductType = ucfirst($arr['ctrolloer']).'Action'; 
            if (class_exists($ProductType)) {
              $p=new $ProductType();
              $p->$arr['action']($arr);
            } else {
                throw new Exception("Error Processing Request", 1);
            }
        }
        
        public static function last()// echo  '脚本执行完了'. PHP_EOL;
        {  
            $info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
            $file=fopen($_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'indexs.html','w'); ///打开文件 指定缓存目录 
            fwrite($file,$info); //写入信息到info.txt  
            fclose($file); //关闭文件info.txt   
            //ob_end_clean();
            ob_end_flush();
            flush(); 
        }
        
         static  public function loadFile($className)
         {
                $dir=array(); 
                $dir[0]=.'/application/';    //指定多个目录
                $dir[1]=.'/module/';
                $file_arr=self::find_file($dir,$className);
                foreach($file_arr as $value){
                    if(is_file($value) ){
                        return include_once $value;
                     }else{
                        throw new \Exception('找不到'.$className.'类');
                     }
                }
          }

           public static function find_file($paths=array(),$name)
           {
                $name=ucfirst($name).'.php';
                $found=array();
                foreach ($paths as $dir){
                   if (is_file($dir.$name)){
                     $found[] = $dir.$name;
                   }
                }
               return $found;    
           }
             
            // 注册自动装载机
            static public function autoLoad()
            {
                spl_autoload_register( array(__CLASS__,'loadFile') );
            }
        
            // 注册自动装载机2   //如有必要注册多个自动加载函数
            static public function autoLoad2()   
            {
                spl_autoload_register( array(__CLASS__,'loadFile2') );
            }
    }
     
    
    
    abstract class DB{
            public $db=NULL;
            public $table=NULL;
            public $config=array(
                           'dsn'=>'mysql:dbname=test;host=127.0.0.1',
                           'user'=>'root',
                           'password'=>'root',
						   'charset'=>'utf8',
						   'persistent'=>false  //持久性链接
                           );
          
			public  $options = array(
				PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ",
			);
			
			public function __construct($table){
				$this->table=$table;
				$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= $this->config ['charset'];
				if($this->config ['persistent']){
					$this->options[PDO::ATTR_PERSISTENT] = true;
				} 
				try {
				   // 长连接,如有需要将array(PDO::ATTR_PERSISTENT=>true) 作为第四个参数
				  $this->db=$pdo = new \PDO ( $this->config ['dsn'],$this->config ['user'],$this->config ['password'],$this->options);
				  
				 //$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT); //不显示错误
				 
				  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);//显示警告错误,并继续执行
				  
				  $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//产生致命错误,PDOException
				  //$this->db->exec('set names utf8');
				 } catch ( \Exception $e ) {
					throw new \Exception ( $e->getMessage () );
				 }
			}
	 
            public function query($sql){
               return  $re=$this->db->query($sql);
            }
       
            public function select($sql) /*查询*/  
            {
                $re=$this->query($sql);
                return $re->fetchAll();
            }  

            public function add($arr=array()){  /*添加*/
                $sql = 'insert into ' . $this->table . ' (' . implode(',',array_keys($arr)) . ')';
                $sql .= " values ('";
                $sql .= implode("','",array_values($arr));
                $sql .= "')"; 
                $stmt = $this->db->prepare($sql);
                $stmt->execute($arr); 
               echo $this->db->lastinsertid();   
           } 
           
           public function update($arr,$where = ' where 1 limit 1'){ /*修改*/
            //$sql = "UPDATE `user` SET `password`=:password WHERE `user_id`=:userId";   
            $sql = 'update ' . $this->table .' set ';
            foreach($arr as $k=>$v) {
                $sql .= $k . "='" . $v ."',";
            }
             $sql = rtrim($sql,',');
             $sql .= $where; 
               $stmt = $this->db->prepare($sql);
             $stmt->execute($arr);    
               return $stmt->rowCount();        
           }
           
           public function delete($sql){ /*删除*/ 
             $stmt = $this->db->prepare($sql);
             $stmt->execute();
             return $stmt->rowCount();
           } 
    }
    ////可以每一张表一个类 统一继承DB类。。。。。
    class Article extends DB{ 
    }
?>
<script>
    var x=1,y=z=0;
    function add(n){
      n=n+1;
    }
    y=add(x);
    function add(n){
      n=n+3;
    }
z=add(x); 
</script>
相关标签: 200行描述MVC