当前位置:  编程技术>php
本页文章导读:
    ▪php开发一个简单的MVC      本文通过实例为大家介绍用php开发一个简单mvc的方法,起到势砖引玉的作用,本文比较适合刚接触mvc的朋友。 MVC其实就是三个Model,Contraller,View单词的简称。 Model,主要任务就是把数据库或.........
    ▪学习error_reporting的用法           error_reporting在php编程中的使用频度,想必大家是非常清楚的了,本文介绍error_reporting的用法,供大家学习参考。 如果参数 level 未指定,当前报错级别将被返回。下面几项是 level 可能.........
    ▪empty()和isset()函数的区别          本文介绍php中empty和isset()函数的区别,有兴趣的朋友可以参考学习下。   在使用 php 编写页面程序时,我经常使用变量处理函数判断 php 页面尾部参数的某个变量值是否为空,开始的.........

[1]php开发一个简单的MVC
    来源: 互联网  发布时间: 2013-12-24

本文通过实例为大家介绍用php开发一个简单mvc的方法,起到势砖引玉的作用,本文比较适合刚接触mvc的朋友。

MVC其实就是三个Model,Contraller,View单词的简称。
Model,主要任务就是把数据库或者其他文件系统的数据按 照我们需要的方式读取出来。
View,主要负责页面的,把数据以html的形式显示给用户。
Controller,主要负责业务逻辑,根据用户的 Request进行请求的分配,比如说显示登陆界面,就需要调用一个控制器userController的方法loginAction来显示。

本文为大家介绍如何用PHP来创建一个简单的MVC结构系统。

首先创建单点入口,即bootstrap文件index.php,作为整个MVC系统的唯一入口。
什么是单点入口呢?所谓单点入口就是整个应用程序只有一 个入口,所有的实现都通过这个入口来转发。为什么要做到单点入口呢?
单点入口有几大好处:
第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。 比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面。
第二、程序的架构更加 清晰明了。
 

代码如下:
<?php
include("core/ini.php");
initializer::initialize();
$router = loader::load("router");
dispatcher::dispatch($router);

这个文件就只有4句,我们现在一句句来分析。
include(”core/ini.php”);

我们来看core/ini.php
 

代码如下:
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . "core/main");
//set_include_path — Sets the include_path configuration option
function __autoload($object){
  require_once("{$object}.php");
}

这个文件首先设置了include_path,也就是我们如果要找包含的文件,告诉系统在这个目录下查找。其实我们定义__autoload()方法,这个方法是在PHP5增加的,就是当我们实例化一个函数的时候,如果本文件没有,就会自动去加载文件。官方的解释是:
Many developers writing object-oriented applications create one PHP source file per-class definition. One of the biggest annoyances is having to write a long list of needed includes at the beginning of each script (one for each class).

In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn’t been defined yet. By calling this function the scripting engine is given a last chance to load the class before PHP fails with an error.

接下来我们看下面一句
initializer::initialize();
这就话就是调用initializer类的一个静态函数initialize,因为我们在ini.php,设置了include_path,以及定义了__autoload,所以程序会自动在core/main目录查找initializer.php.
initializer.php文件如下:
 

代码如下:
<?php
class initializer
{
 public static function initialize() {
  set_include_path(get_include_path().PATH_SEPARATOR . "core/main");
  set_include_path(get_include_path().PATH_SEPARATOR . "core/main/cache");
  set_include_path(get_include_path().PATH_SEPARATOR . "core/helpers");
  set_include_path(get_include_path().PATH_SEPARATOR . "core/libraries");
  set_include_path(get_include_path().PATH_SEPARATOR . "app/controllers");
  set_include_path(get_include_path().PATH_SEPARATOR."app/models");
  set_include_path(get_include_path().PATH_SEPARATOR."app/views");
  //include_once("core/config/config.php");
 }
}
?>

这个函数很简单,就只定义了一个静态函数,initialize函数,这个函数就是设置include_path,这样,以后如果包含文件,或者__autoload,就会去这些目录下查找。

OK,我们继续,看第三句
$router = loader::load(”router”);

这句话也很简单,就是加载loader函数的静态函数load,下面我们来loader.php
 

代码如下:
<?php
class loader
{
  private static $loaded = array();
  public static function load($object){
    $valid = array(  "library",
                     "view",
                            "model",
                            "helper",
                            "router",
                            "config",
                            "hook",
                            "cache",
                            "db");
    if (!in_array($object,$valid)){
    throw new Exception("Not a valid object '{$object}' to load");
    }
    if (empty(self::$loaded[$object])){
      self::$loaded[$object]= new $object();
    }
    return self::$loaded[$object];
  }
}

这个文件就是去加载对象,因为以后我们可能会丰富这个MVC系统,会有model,helper,config等等的组件。如果加载的组件不在有效 的范围内,我们抛出一个异常。如果在的话,我们实例化一个对象,其实这里用了单件设计模式。也就是这个对象其实就只能是一个实例化对象,如果没有实例化, 创建一个,如果存在的,则不实例化。

好,因为我们现在要加载的是router组件,所以我们看下router.php文件,这个文件的作用就是映射URL,对URL进行解析。
router.php
 

代码如下:
<?php
class router
{
  private $route;
  private $controller;
  private $action;
  private $params;
  public function __construct()
  {
    $path = array_keys()($_GET);
    if (!isset()($path[0])){
      if (!empty($default_controller))
           $path[0] = $default_controller;
      else
           $path[0] = "index";
    }
    $route= $path[0];
    $this->route = $route;
    $routeParts = split( "/",$route);
    $this->controller=$routeParts[0];
    $this->action=isset($routeParts[1])? $routeParts[1]:"base";
    array_shift($routeParts);
    array_shift($routeParts);
    $this->params=$routeParts;
  }
  public function getAction() {
    if (empty($this->action)) $this->action="/blog_article/main/index.html";
    return $this->action;
  }
  public function getController()  {
    return $this->controller;
  }
  public function getParams()  {
    return $this->params;
  }
}

我们可以看到,首先我们是拿到$_GET,用户Request的URL,然后从URL里我们解析出Controller和Action,以及Params
比如我们的地址是http://www.tinoweb.cn/user/profile/id/3
那么从上面的地址,我们可以拿到controller是user,action似乎profile,参数是id以及3

OK我们看最后一句,就是
dispatcher::dispatch($router);

这句话的意思很明了,就是拿到URL解析的结果,然后通过dispatcher来分发controlloer及action来Response给用户
好,我们来看下dispatcher.php文件
 

代码如下:

<?
class dispatcher
{
  public static function dispatch($router)
  {
    global $app;
    ob_start();
    $start = microtime(true);
    $controller = $router->getController();
    $action = $router->getAction();
    $params = $router->getParams();
    $controllerfile = "app/controllers/{$controller}.php";
    if (file_exists($controllerfile)){
      require_once($controllerfile);
      $app = new $controller();
      $app->setParams($params);
      $app->$action();
      if (isset($start)) echo "

Tota1l time for dispatching is : ".(microtime(true)-$start)." seconds.";
      $output = ob_get_clean();
      echo $output;
     }else{
 throw new Exception("Controller not found");
     }
   }
}

这个类很明显,就是拿到$router来,寻找文件中的controller和action来回应用户的请求。
OK,我们一个简单的,MVC结构,就这样,当然这里还不能算是一个很完整的MVC,因为这里还没有涉及到View和Model,有空我再这里丰富。
我们来写个Controller文件来测试下上面的这个系统。
我们在app/controllers/下创建一个user.php文件
//user.php
 

代码如下:
<?php
class user
{
  function base()
  {
  }
  public function login()
  {
    echo 'login html page';
  }
  public function register()
  {
    echo 'register html page';
  }
  public function setParams($params){
 var_dump($params);
  }
}

然后,可以在浏览器中输入http://localhost/index.php?user/register 或 http://localhost/index.php?user/login来测试下。


    
[2]学习error_reporting的用法
    来源: 互联网  发布时间: 2013-12-24

     error_reporting在php编程中的使用频度,想必大家是非常清楚的了,本文介绍error_reporting的用法,供大家学习参考。

如果参数 level 未指定,当前报错级别将被返回。下面几项是 level 可能的值:
1         E_ERROR
2         E_WARNING
4         E_PARSE
8          E_NOTICE
16        E_CORE_ERROR
32      E_CORE_WARNING
64        E_COMPILE_ERROR
128     E_COMPILE_WARNING
256     E_USER_ERROR
512     E_USER_WARNING
1024   E_USER_NOTICE
2047   E_ALL
2048   E_STRICT

E_NOTICE 表示一般情形不记录,只有程式有错误情形时才用到,例如企图存取一个不存在的变数,或是呼叫 stat() 函式检视不存在的档案。 E_WARNING 通常都会显示出来,但不会中断程式的执行。这对除错很有效。例如:用有问题的常规表示法呼叫 ereg()。

E_ERROR 通常会显示出来,亦会中断程式执行。意即用这个遮罩无法追查到记忆体配置或其它的错误。

E_PARSE 从语法中剖析错误。

E_CORE_ERROR 类似 E_ERROR,但不包括 PHP 核心造成的错误。

E_CORE_WARNING 类似 E_WARNING,但不包括 PHP 核心错误警告。

PHP 的错误报告

    php.ini 文件中有许多配置设置。您应当已经设置好自己的 php.ini 文件并把它放在合适的目录中,就像在 Linux 上安装 PHP 和 Apache 2 的文档说明中所示的那样。在调试 PHP 应用程序时,应当知道两个配置变量。下面是这两个变量及其默认值:
display_errors = Off
error_reporting = E_ALL

    通过在 php.ini 文件中搜索它们,可以发现这两个变量当前的默认值。display_errors 变量的目的很明显 —— 它告诉 PHP 是否显示错误。默认值是 Off。但是,要让开发过程更加轻松,请把这个值设为 On:
display_errors = On

    error_reporting 变量的默认值是 E_ALL。这个设置会显示从不良编码实践到无害提示到出错的所有信息。E_ALL 对于开发过程来说有点太细,因为它在屏幕上为一些小事(例如变量未初始化)也显示提示,会搞糟浏览器的输出。我只想看到错误和不良编码实践,但是不想看到 无害的提示。所以,请用以下值代替 error_reporting 的默认值:
error_reporting = E_ALL & ~E_NOTICE

    重新启动 Apache,就全部设置好了。接下来,将学习如何在 Apache 上做同样的事。

    服务器上的错误报告依赖于 Apache 正在做的工作,在 PHP 中打开错误报告可能没法工作,因为在计算机上可能有多个 PHP 版本。有时很难区分 Apache 正在使用哪个 PHP 版本,因为 Apache 只能查看一个 php.ini 文件。不知道 Apache 正在使用哪个 php.ini 文件配置自己是一个安全问题。但是,有一种方法可以在 Apache 中配置 PHP 变量,从而保证设置了正确的出错级别。

    而且,最好知道如何在服务器端设置这些配置变量,以否决或抢占 php.ini 文件,从而提供更高级别的安全性。

    在配置 Apache 时,应该已经接触过 <apache2-install-dir>/conf/httpd.conf 中 http.conf 文件中的基本配置。

   要做在 php.ini 文件中已经做过的事,请把下列各行添加到 httpd.conf,覆盖任何 php.ini 文件:
php_flag   display_errors         on
php_value error_reporting       2039
    这会覆盖在 php.ini 文件中为 display_errors 已经设置的标志,以及 error_reporting 的值。值 2039 代表 E_ALL & ~E_NOTICE。如果愿意采用 E_ALL,请把值设为 2047。同样,还是要重启 Apache。

    接下来,要在服务器上测试错误报告。

    关于error_reporting()这个函数,它是可以屏蔽到一些错误信息,但是PHP 核心造成的错误,是无法屏蔽的,因为PHP 核心造成的错误会直接导致PHP文件编译失败,因为书写格式没有按照PHP的编码规则写而造成的错误,是无法屏蔽的。
 

代码如下:
* For now, avoid warnings of E_STRICT mode
* (this must be done before function definitions)
*/
if (defined(’E_STRICT’)) {
    $old_error_reporting = error_reporting(0);
    if ($old_error_reporting & E_STRICT) {
        error_reporting($old_error_reporting ^ E_STRICT);
    } else {
        error_reporting($old_error_reporting);
    }
    unset($old_error_reporting);

常见的如下:
 

代码如下:
// Turn off all error reporting;关闭所有的错误
error_reporting(0);

// Report simple running errors;报告一个简单的运行错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings …);包括报告一些未初始化的变量或捕捉变量名的拼写错误
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini;报告所有的错误但不包括E_NOTICE
error_reporting(E_ALL ^ E_NOTICE);

// Report all PHP errors (bitwise 63 may be used in PHP 3);报告所有的错误
error_reporting(E_ALL);

// Same as error_reporting(E_ALL);同上
ini_set(’error_reporting’, E_ALL);

    
[3]empty()和isset()函数的区别
    来源: 互联网  发布时间: 2013-12-24

    本文介绍php中empty和isset()函数的区别,有兴趣的朋友可以参考学习下。

  在使用 php 编写页面程序时,我经常使用变量处理函数判断 php 页面尾部参数的某个变量值是否为空,开始的时候我习惯了使用 empty() 函数,却发现了一些问题,因此改用 isset() 函数,问题不再。

     顾名思义,empty() 判断一个变量是否为“空”,isset() 判断一个变量是否已经设置。正是这种所谓的“顾名思义”,令我开始时走了些弯路:当一个变量值等于0时,empty()也会成立(True),因而会发生一些意外。原来,empty() 和 isset() 虽然都是变量处理函数,它们都用来判断变量是否已经配置,它们却是有一定的区别:empty还会检测变量是否为空、为零。当一个变量值为0,empty() 认为这个变量同等于空,即相当于没有设置。

    比如检测 $id 变量,当 $id=0 时,用empty() 和 isset() 来检测变量 $id 是否已经配置,两都将返回不同的值—— empty() 认为没有配置,isset() 能够取得 $id 的值:
   

代码如下:
$id=0;
    empty($id)?print "It's empty .":print "It's $id .";
      //结果:It's empty .
    print "<br>";
    !isset($id)?print "It's empty .":print "It's $id .";
      //结果:It's 0 .  

   这意味着,我们在使用变量处理函数时,当该变量可能出现0的值,使用 empty() 要小心,这个时候用 isset 取代它更明智一些。

    当一个php页面的 URL 尾部参数出现 id=0 时(比如:test.php?id=0),试比较:
 

代码如下:
if(empty($id)) $id=1; - 若 id=0 ,id 也会为1
if(!isset($id)) $id=1; - 若 id=0 ,id 不会为1

可分开运行以下代码检测上述推断:
 

代码如下:

if(empty($id)) $id=1;
    print $id; // 得到 1

    if(!isset($id)) $id=1;
    print $id; //得到 0  

  要说它们的联系,其共同点就是empty()和isset()都是变量处理函数,作用是判断变量是否已经配置,正是由于它们在处理变量过程中有很大的相似性,才导致对它们的关系认识不足。单从empty()和isset()这两个函数本身来考虑的话会把人弄得更糊涂,换一个角度来它。empty()和isset()的处理对象无外乎未定义变量,0,空字符串。
   如果变量为0,则empty()会返回TRUE,isset()会返回TRUE;

   如果变量为空字符串,则empty()会返回TRUE,isset()会返回TRUE;

   如果变量未定义,则empty()会返回TRUE,isset()会返回FLASE;

    手册中对empty()的解释

    描述bool empty( mixed var )
    如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

    手册中对isset()的解释

    isset() 检测变量是否设置
    描述 bool isset ( mixed var [, mixed var [, ...]] )
    如果 var 存在则返回 TRUE,否则返回 FALSE。
    如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数。

    警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined()函数。
    1. 当要 判断一个变量是否已经声明的时候 可以使用 isset 函数
    2. 当要 判断一个变量是否已经赋予数据且不为空 可以用 empty 函数
    3. 当要 判断 一个变量 存在且不为空 先isset 函数 再用 empty 函数


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3