Menu
Woocommerce Menu

详解php常用数组函数实例,MVC框架之加载器学习笔记银河国际网址手机版

0 Comment


本文实例总结了php常用数组函数。分享给大家供大家参考,具体如下:

在上午和业务需求战斗结束之后,准备打开群看看各位老司机有没有看车,突然看到
@E舞九天 II 发的一些消息

上节说了MVC的路由原理,这节我们来说说MVC框架的loader,也称为加载器。

1. array array_merge(array $array1 [, array  $array2 [,
$array]])

银河国际网址手机版 1 

虽然不同的框架,加载器的用法不同,但是其原理都是相通的。。。都是通过单例模式加载文件,而且把已加载的文件cache起来,避免重复加载。。。因为在开发业务的过程中,常常需要加载不同的模块,不同的类库等,MVC的loader可以帮助我们实现单例模式,更加符合开发需求。

函数功能:将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回结果的数组。

他发现,PHP 的布尔值自增,无论自增多少遍,最后输出的都是 1 

下面我们开始动手,利用其原理,做一个简单的loader。

如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

这就比较有趣了~

首先,我们设计的加载器,要满足可以全局使用,无论在controller里还是在model、library里都可以使用。

如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

自增和自减,++$a 和 $a++ 的区别大家都知道

其次,加载器要有缓存能力,即相同的文件只加载一次,相同的类只实例化一次。

例1:数组中有相同的字符串键名

++a 表示取 a 的地址,增加内存中 a 的值,然后把值放在寄存器中
a++ 表示取 a 的地址,把 a 的值装入寄存器中,然后增加内存中 a 的值

最后,要能加载多种文件,model、library、helper。

 

我打开一个编辑器,去确认一下这个结果

先解决第一步,怎么全局使用,最简单的办法就是定义一个全局的function,这样,在后面的不同类库,不同function里都可以调用这个全局function,进行加载文件。

 代码如下

$a = true;
var_dump(--$a);
echo PHP_EOL;
echo $a;
$b = false;
echo PHP_EOL;
var_dump(++$b);

第二步和第三步,要一起解决,定义一个单例模式的loader类,因为是单例模式,可以保证全局只有一份内容,这样的话,就可以利用数组把这些已加载的内容和对象cache起来,这样就可以避免了重复加载的问题。。。

$array1=array(‘color’=>’greed’,’3’=>8);

运行最后输入结果如下

 代码如下

$array2=array(“a”,’color’=>”red”,’3’=>8);

bool(true)
1
bool(false)

if ( ! function_exists(‘load’))  
{  
    function load($name, $type=’model’, $data=array())  
    {  
        static $loader = NULL;  
        if (is_null($loader))  
        {  
            include
(ROOT.’/system/core/loader.php’);  
            $loader = Loader::get_instance();  
        }  
 
        return $loader->$type($name, $data);  
    }  

var_dump(array_merge($array1,$array2));

发现结果和之前设想的不太对,PHP
对于布尔值的自增运算没有做任何处理,而自增后为 1 是因为我们使用了 echo
去输出,导致 bool 被强转

上面这个,就是我写的一个简单的全局函数
load,这个函数的作用就是为了可以全局调用,然后通过这个load函数,去调用loader类,由loader类负责加载文件,实例化,和缓存对象。。。下面我把loader的代码放出来给大家看看。

 

去查询 PHP 的官方文档,没想到有一行很明显的提示

 代码如下

输出:

Note: 递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增
NULL 的结果是 1。

<?php  
 
class Loader  
{  
    private $_loaded_models = array();  
    private $_loaded_librarys = array();  
    private static $OBJ;  
 
    # 单例模式,不允许new对象  
    private function __construct()  
    {  
 
    }  
 
 
    public static function get_instance()  
    {  
        if (is_null(self::$OBJ))  
        {  
            $class = __CLASS__;  
            self::$OBJ = new $class;  
        }  
          
        return self::$OBJ;  
    }  
 
    public function model($model, $data=array())  
    {  
        $model = strtolower($model);  
 
        # 如果已经加载,则返回对象,避免重复加载  
        if (isset($this->_loaded_models[$model]))  
        {  
            return $this->_loaded_models[$model];  
        }  
 
        # 否则加载文件  
        include ROOT.“/application/models/{$model}.php”;  
 
        $class = ucfirst($model);  
        # 实例化对象  
        if (emptyempty($data))  
        {  
            $instance = new $class;  
        }  
        else 
        {  
            $instance = new $class($data);  
        }  
        # 把对象cache起来  
        $this->_loaded_models[$model] = $instance;  
 
        return $instance;  
    }  
 
 
    public function library($library, $data=array())  
    {  
        $library = strtolower($library);  
 
        # 如果已经加载,则返回对象,避免重复加载  
        if (isset($this->_loaded_librarys[$library]))  
        {  
            return $this->_loaded_librarys[$library];  
        }  
 
        # 否则加载文件  
        include ROOT.“/application/librarys/{$library}.php”;  
 
        $class = ucfirst($library);  
        # 实例化对象  
        if (emptyempty($data))  
        {  
            $instance = new $class;  
        }  
        else 
        {  
            $instance = new $class($data);  
        }  
          
        # 把对象cache起来  
        $this->_loaded_librarys[$library] = $instance;  
 
        return $instance;  
    }  
 
 
}  
 
 
 
?> 

 

银河国际网址手机版 2

大家看到了没有,这个loader采用的是单例模式,虽然前面的function的设计已经可以保证不会重复实例化loader这个对象,但是为了真正可以保证全局只有一份loader对象,设计成单例模式是最保险的。。。

 代码如下

具体的测试例子请看代码。。。我把代码打包上传上来,有需要的就下载回去看看吧。。。下载后,解压,把lesson2文件夹放到你的www目录下,然后访问yourdomain/MVC/lesson2/index.php/index/test 
试试看吧。。。

array(4){

  [“color”]=> string(3)”red”

  [0]=> int(8)

  [1]=> string(1)”a”

标签:,

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图