当前位置 : 主页 > 网络编程 > PHP >

200行描述MVC

来源:互联网 收集:自由互联 发布时间:2021-07-03
?php header('Content-type: text/html; charset=utf-8'); define('__ROOT__',str_replace('\\\\','/', __DIR__ )); //set_exception_handler(array("Factory","last_fun")); 设置一个用户定义的异常处理函数 Factory::getIns($_SERVER['REQUE
 
<?php
    header('Content-type: text/html; charset=utf-8');
          
    define('__ROOT__',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<controller>[^/.,;?\\n]++)(?:/(?P<action>[^/.,;?\\n]++)(?:/(?P<id>[^/.,;?\\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;$i<$num;$i+=2) {
                     $arr['param'][$pathinfo[$i]]=$pathinfo[$i+1];
                  }
                   
                  return $arr; 
            } else {
                   $ln=parse_url($uri); 
                   parse_str($ln['query'],$array);
                   $arr['ctrolloer']=$array['m'] ? strtolower($array['m']) : 'index';
                   $arr['action']=$array['c'] ? strtolower($array['c']) : 'index';
                   unset($array['m']); unset($array['c']);
                   $arr['param']=$array; 
                   return $arr;
            }
        }
   
        protected function execute($url)
        {
            $arr= self::$ins->set_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]=__ROOT__.'/application/';    //指定多个目录
                $dir[1]=__ROOT__.'/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>

网友评论