一、PHP常用的四种数据结构
简介:spl是php的一个标准库。
官方文档:http://php.net/manual/zh/book.spl.php
<?php //spl(php标准库)数据结构 /** * 栈(先进后出) */ $stack = new SplStack(); $stack->push('data1');//入栈(先进后出) $stack->push('data2');//入栈 $stack->push('data3');//入栈 echo $stack->pop();//出栈 echo $stack->pop();//出栈 echo $stack->pop();//出栈 /** *队列(先进先出) */ $queue = new SplQueue(); $queue->enqueue('data4');//入队列 $queue->enqueue('data5');//入队列 $queue->enqueue('data6');//入队列 echo $queue->dequeue();//出队列 echo $queue->dequeue();//出队列 echo $queue->dequeue();//出队列 echo $queue->dequeue();//出队列 /** * 堆 */ $heap = new SplMinHeap(); $heap->insert('data8');//入堆 $heap->insert('data9');//入堆 $heap->insert('data10');//入堆 echo $heap-&g<strong>)本文来(源gaodai#ma#com搞@@代~&码*网2</strong><pre>搞代gaodaima码
t;extract();//从堆中提取数据
echo $heap->extract();//从堆中提取数据
echo $heap->extract();//从堆中提取数据
/**
* 固定数组(不论使不使用,都会分配相应的内存空间)
*/
$array = new SplFixedArray(15);
$array['0'] = 54;
$array['6'] = 69;
$array['10'] = 32;
var_dump($array);
二、PHP链式操作的实现(原理)
1、入口文件 index.php
<?php /** * 框架入口文件 */ define('BASEDIR',__DIR__);//项目根目录 include BASEDIR.'/Extend/Loader.php';//引入项目自动加载类文件 spl_autoload_register('\\Extend\\Loader::autoload');//执行自动加载函数,完成类的自动加载 $db = new \Extend\Database(); $db->where('uid < 100000')->->order('uid desc')->limit(100);
2、自动加载类 Loader.php
<?php namespace Extend; /** * 实现框架的自动加载 */ class Loader { /** * 实现文件的自动载入 */ static function autoload($class) { require BASEDIR.'/'.str_replace('\\','/',$class).'.php'; } }
3、数据库类Database.php
注:只是原理,并没有对方法进行具体的封装,具体的封装还是看个人喜好去定链式查询的风格。
<?php namespace Extend; class Database { /** * 指定查询条件 * @param $where */ function where($where) { return $this; } /** * 指定排序条件 */ function order($order) { return $this; } /** * 指定查询的限制条数 * @param $limit */ function limit($limit) { return $this; } }
其实就是对传过来的条件进行重新的底层封装,然后再把当前对象返回,使得可以不断的链式查询。
三、PHP魔术方法的使用
在php设计模式中,会涉及到很多魔术方法的使用,这里也对经常会用到的魔术方法进行简单总结。
1、框架入口文件 index.php
<?php /** * 框架入口文件 */ define('BASEDIR',__DIR__);//项目根目录 include BASEDIR.'/Extend/Loader.php';//引入项目自动加载类文件 spl_autoload_register('\\Extend\\Loader::autoload');//执行自动加载函数,完成类的自动加载 /** * 魔术方法的使用 */ # 实例化Object类 $obj = new \Extend\Object();//当前文件不存在这个类,就会自动执行自动加载函数去包含相应的类文件(即 Extend/Object.php) # __set 和 __get 对不存在的属性进行接管 $obj->title = 'xiaobudiu'; //当对一个不存在的类属性赋值时,会自动调用类中定义的__set() echo $obj->title; //当调用一个不存在的类属性时,会自动调用类中定义的__get() # __call 和 __callStatic 对不存在或者权限不够的类方法进行接管 $obj->getUserInfo('1000068'); //当调用一个不存在的类方法时,会调用__call(),并自动将当前方法名和参数传到__call方法中 \Extend\Object::getOpenId('1000068'); //当调用一个不存在的类静态方法时,会调用__callStatic(),并自动将当前方法名和参数传递到__callStatic方法中 # echo或print对象时,由__toString 接管 echo $obj; //当echo或print一个对象时,会自动调用类中定义的__toString方法 # 在php中,如果我们把一个对象当成函数用,则由__invoke()接管 $obj('xiaobudiu');//当我们将一个对象当成函数用的时候,会自动调用当前类中定义的__invoke()方法