作为程序员一定要保持良好的睡眠,才能好编程

php代码规范 提醒 温故

发布时间:2018-04-16


在编写php ,什么样的代码 大家更容易看懂,更高端、更装逼



microtime(true);

memory_get_usage() 内存使用情况

define() 

const

DIRECTORY_SEPARATOR 目录

dirname()

basename()

define('IS_CLI', PHP_SAPI == 'cli' ? true : false);
define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);

get_declared_classes();  返回由已定义类的名字所组成的数组

sandir(__DIR__);

config::load($filename,"database");


$_arr=[]
echo "日志信息:".var_export(["say","大家好"],true); //以字符串的形式返回 
日志信息:array (
  0 => 'say',
  1 => '大家好',
)

BIND_MODULE && Route::bind(BIND_MODULE);  记得这样的语句后面不能写 return 



//获取一个类的方法 是否公开,是否static 获取一个方法的相关信息。
if (method_exists($className, 'invoke')) {
    $method = new \ReflectionMethod($className, 'invoke');

    if ($method->isPublic() && $method->isStatic()) {
        return $className::invoke(Request::instance());
    }
}

$result = method_exists($className, 'instance') ?
$className::instance() :
new $className;


//获取一个function的相关信息
$reflect = new \ReflectionFunction($function);
$args    = self::bindParams($reflect, $vars);




//如果设置了缓存,如何进行header头的设置?

if (200 == $this->code) {
    $cache = Request::instance()->getCache();
    if ($cache) {
        $this->header['Cache-Control'] = 'max-age=' . $cache[1] . ',must-revalidate';
        $this->header['Last-Modified'] = gmdate('D, d M Y H:i:s') . ' GMT';
        $this->header['Expires']       = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + $cache[1]) . ' GMT';
        Cache::tag($cache[2])->set($cache[0], [$data, $this->header], $cache[1]);
    }
}

判断header 有没有发送,如果没有发送,添加下面信息
if (!headers_sent() && !empty($this->header)) {
    // 发送状态码
    http_response_code($this->code);
    // 发送头部信息
    foreach ($this->header as $name => $val) {
        if (is_null($val)) {
            header($name);
        } else {
            header($name . ':' . $val);
        }
    }
}



APP_PATH=dirname($_SERVER['SCRIPT_FILEnAME']).DS;

ROOT_PATH=dirname(realpath(APP_PATH)).DS;

PHP_OS  返回系统常量\



public function pathinfo()
{
    if (is_null($this->pathinfo)) {
        if (isset($_GET[Config::get('var_pathinfo')])) {
            // 判断URL里面是否有兼容模式参数
            $_SERVER['PATH_INFO'] = $_GET[Config::get('var_pathinfo')];
            unset($_GET[Config::get('var_pathinfo')]);
        } elseif (IS_CLI) {
            // CLI模式下 index.php module/controller/action/params/...
            $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : '';
        }

        // 分析PATHINFO信息
        if (!isset($_SERVER['PATH_INFO'])) {
            foreach (Config::get('pathinfo_fetch') as $type) {
                if (!empty($_SERVER[$type])) {
                    $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ?
                    substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type];
                    break;
                }
            }
        }
        $this->pathinfo = empty($_SERVER['PATH_INFO']) ? '/' : ltrim($_SERVER['PATH_INFO'], '/');
    }
    return $this->pathinfo;
}

使用正则进行替换
public function path()
{
    if (is_null($this->path)) {
        $suffix   = Config::get('url_html_suffix');
        $pathinfo = $this->pathinfo();
        if (false === $suffix) {
            // 禁止伪静态访问
            $this->path = $pathinfo;
        } elseif ($suffix) {
            // 去除正常的URL后缀
            $this->path = preg_replace('/\.(' . ltrim($suffix, '.') . ')$/i', '', $pathinfo);
        } else {
            // 允许任何后缀访问
            $this->path = preg_replace('/\.' . $this->ext() . '$/i', '', $pathinfo);
        }
    }
    return $this->path;
}


echo $a;
print_r(error_get_last());
打印内容:
Array
(
    [type] => 8
    [message] => Undefined variable: a
    [file] => C:\WWW\index.php
    [line] => 2
)




   const CI_VERSION = '3.1.3';  //定义常量
   
   
   //解析名称,如果首字母是小写 则替换成大写,
   //如果UserName 则替换成user_name 这样的方式
   
   // rpeg_replace_callback(正则,回调函数,匹配的内容) 的用法  
   
   function parseName($name, $type = 0, $ucfirst = true){
    if ($type) {
        $name = preg_replace_callback('/_([a-zA-Z])/', function ($match) {
            var_dump($match);
            return strtoupper($match[1]);
        }, $name);
        return $ucfirst ? ucfirst($name) : lcfirst($name);
    } else {
        return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
    }
}


echo parseName("UserName"); //user_name

echo parseName("username",1); //Username


==============================================================


   

   if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php'))
   {
      require_once(APPPATH.'config/'.ENVIRONMENT.'/constants.php');
   }
   
   require_once(BASEPATH.'core/Common.php');
   
   
   
   E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity
   set_error_handler('_error_handler');
   
   
   
   set_exception_handler('_exception_handler');
   register_shutdown_function('_shutdown_handler');
   
   
   
   //定义php提醒错误 页面的布局
   set_exception_handler('exception_handler');
   function exception_handler($exception) {
  echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

throw new Exception('Uncaught Exception');
echo "Not Executed\n";
   
   
   
   if ( ! empty($assign_to_config['subclass_prefix'])){
           get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
    }
   
   
   $EXT =& load_class('Hooks', 'core');
   
   
   /*
 * ------------------------------------------------------
 *  Is there a "pre_system" hook?
 * ------------------------------------------------------
 */
   就是这样实现了数据的横切。其实这样的代码也是流式开发
   
   $EXT->call_hook('pre_system');
   $EXT->call_hook('post_controller_constructor');
   
   ...
   $EXT->call_hook('post_controller');
   
   require_once(BASEPATH.'core/compat/password.php');
   
   举例:你看  也是从上到下的执行,也等于是流式的,怎么说是aop思想,横切?
   
   
   
   
   //调用这个$this类中的$method 方法 ,传入$params  
   call_user_func_array(($this,$method),$params);
   
   看看这个方法有什么用途?
        class User{
        
            public $name;
            public $age;
        
            public function __construct(){
        
            }
        
            public function __set($key,$val){
                $this->$key=$val;
            }
            public function __get($key){
                return $this->$key;
            }
        
            public function info($d,$message){
                return "{$this->name}同学 {$this->age}岁"."-----{$d}:{$message}";
            }
        
        
        }
        $user=new User();
        $user->age=22;
        $user->name='james';
        $params=["say","大家好"];
        //$params 这里传递的是一个数组,传递过去以后,与对应方法的参数一一对应
        echo call_user_func_array(array($user,"info"),$params);
        结果:james同学 22岁-----say:大家好
        
        
        
// Mark a start point so we can benchmark the controller
   $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
   
   $CI = new $class();

/*
 * ------------------------------------------------------
 *  Is there a "post_controller_constructor" hook?
 * ------------------------------------------------------
 */
   $EXT->call_hook('post_controller_constructor');

/*
 * ------------------------------------------------------
 *  Call the requested method
 * ------------------------------------------------------
 */
   call_user_func_array(array(&$CI, $method), $params);

   // Mark a benchmark end point
   $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); 
        
  if (preg_match('#^'.$key.'$#', $uri, $matches))
{
   // Are we using callbacks to process back-references?
   if ( ! is_string($val) && is_callable($val))
   {
      // Remove the original string from the matches array.
      array_shift($matches);

      // Execute the callback using the values in matches as its parameters.
      $val = call_user_func_array($val, $matches);
   }
   // Are we using the default routing method for back-references?
   elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE)
   {
      $val = preg_replace('#^'.$key.'$#', $val, $uri);
   }

   $this->_set_request(explode('/', $val));
   return;
}