1、require,include,require_once,include_once的区别
require:
处理文件的方式: 一般放在php文件的最上方,require进来的file1会成为这个文件的一部分,先解析file1,再解析文件 中的内容,
错误处理方式: 如果file1里面有错误,php文件中的程序也不能继续走下去,而且生成的错误是致命错误;
多次执行时: 不管在这个文件中多少次require这个file1,只会解析一次file1;
一般用在哪里: 一般用于静态文件或者本身不包含自身变量的文件等
include:
处理文件的方式: include进来的file1只是一个外部引入的文件
错误处理方式: 如果file1里面有错误,会生成警告,php文件中接下来的程序也能走下去
多次执行时: 每出现一次Include都会重新解析文件,如果是同一个文件并且了里面有定义变量的话就会造成变量 的重复定义
一般用在哪里: 一般用在循环语句或条件判断语句中比较多
require_once和include_once用法差不多,执行之前都会先检查一下之前有没有引入过这个文件,之前引入过就不再引入了
2、关于类
类的定义:类是具有相同属性和方法的对象的集合
对象:对象是把属性具体化,然后交给类处理,对象本身不包括方法,但是对象有一个指针指向类,这个类可以有方法
3、对类进行封装的时候,要注重其扩展性,封装性,独立性。
扩展性:即这个类能够适应较多的跟其属性相关的弹性需求,一旦有新的功能需要添加或修改,则不需要一次次修改类中的代码,不懂程序的人也能够修改相关的配置文件来达到目的;
封装性:这个类只需要让别人知道是干什么用的,传什么参数,得出什么结果,至于处理的过程,则由这个类封装,外部是无法知晓的,也无法轻易修改,保证其安全性;
独立性:这个类需要具有独立性,即把它放在任何一个地方,都能够实现它所定义的功能,不依赖于某个必须的文件或库。
4、自定义函数的功能可以多,但是最好是同一个属性的,比如写入、读取、执行是三种不同的属性。一个函数内最好不要同时定义多个属性的功能,这样属性和功能一多其他使用者会混乱,而且需要更改某个属性的功能时不方便,可能造成函数体过于庞大,反而失去了函数轻巧、灵活的特质。
附:DataMatch.class.php 数据搜索精灵 ( 在扩展性和封装性方面显然还是不够的)
<?php
include './function/function.php';
$sysconfig = include('./config/config.php');//配置文件
c($sysconfig);//c函数,用于获取配置中的内容
class DataMatch{
protected $resource_arr;//数据源,数组格式 具体格式要求见data.php
public $input_str;//待匹配数据,字符串
protected $priority;//优先级 一维数组 默认空数组时不按优先级匹配
protected $num;//一共需要匹配多少条数据
protected $error_info;//错误信息
<span style="white-space:pre"> </span>//搜索
public function search(){
if(!empty($this->priority)){//如果有传入优先级,那么使用处理优先级的方法
$retain_pos = $this-> arr_preg_priority();
}else{
$retain_pos = $this->arr_preg_normal();
}
$result_arr = $this->arr_sort($retain_pos,$this->resource_arr,$this->num);//筛选初级匹配的数组
return $result_arr;//返回匹配的结果
}
/**
* [getData 接收输入的数组并判断数组格式是否正确]
* @param [type] $data [输入的数组]
* @return [type] [description]
*/
public function setData($data,$str,$num){
//判断数据格式是否符合要求
foreach($data as $v){
if(!is_array($v) || count($v)!=4 ){
$this->error_info = '传入的数组格式不正确';
return false;
}
}
if(!is_string($str)){
$this->error_info = '传入的待匹配值格式不正确';
return false;
}
$this->resource_arr = $data;
$this->input_str = $str;
$this->num = $num;
}
/**
* [getPriority 接收输入的优先级并判断优先级是否正确]
* @param [type] $priority [description]
* @return [type] [description]
*/
public function setPriority($priority){
if(!is_array($priority) || empty($priority)){
$this->error_info = '传入的优先级格式不正确或为空';
return false;
}
$this->priority = $priority;
return $this->priority;
}
/**
* [arr_preg 正常匹配函数--得到初级匹配值]
* @param [type] $arr [数据源]
* @param [type] $input [待匹配的值]
* @param [type] $priority [优先级]
* @return [type] [description]
*/
protected function arr_preg_normal(){
$preg = '/'.$this->input_str.'/i';
$retain_pos = array();
foreach($this->resource_arr as $key => $v){
foreach($v as $value){
if(preg_match($preg,$value)){
$preg_pos = stripos($value,$this->input_str);
if($retain_pos[$preg_pos]['sum']<$this->num && $retain_pos[0]['sum']<$this->num){//如果同一个位置且第0位匹配到的数超过需要展示的数,那这个位置的数就不再匹配
$retain_pos[$preg_pos]['sum'] += 1; //将匹配到同一个位置的次数记录下来
$retain_pos[$preg_pos]['key'][] = $key; //记录下匹配到的键名
}
}
break;//这条数据匹配到了就不再匹配了
}
}
return $retain_pos;
}
/**
* [arr_preg_priority 优先级匹配函数---得到初级匹配值]
* @return [type] [description]
*/
protected function arr_preg_priority(){
$preg = '/'.$this->input_str.'/i';
$retain_pos = array();
foreach($this->priority as $value){
foreach($this->resource_arr as $key => $v){
if(preg_match($preg,$v[$value])){
$preg_pos = stripos($v[$value],$this->input_str);
if($retain_pos[$preg_pos]['sum']<$this->num && $retain_pos[0]['sum']<$this->num){//如果同一个位置且第0位匹配到的数超过需要展示的数,那这个位置的数就不再匹配
$retain_pos[$preg_pos]['sum'] += 1; //将匹配到同一个位置的次数记录下来
$retain_pos[$preg_pos]['key'][] = $key; //记录下匹配到的键名
}
}
}
if(count($retain_pos)>=$this->num){//如果这一个优先级的数据已经匹配完成,那么不再继续匹配下一个优先级的
break;
}
}
return $retain_pos;
}
/**
* [arr_sort 筛选数组,返回$num个匹配完成的最优结果]
* @param [type] $retain_pos [初级匹配结果]
* @param [type] $resource_arr [数据源]
* @param [type] $number [需要匹配的个数]
* @return [type] [description]
*/
public function arr_sort($retain_pos,$resource_arr,$number){
$compare=array_keys($retain_pos);//得到$retain_pos中所有的键值
asort($compare);//对键值进行排序
$count = end($compare);//取出最大的那一个
$output_arr = array();
for($i=0;$i<=$count;$i++){
if(isset($retain_pos[$i])){//如果位置$i有匹配到的次数
for($j=0;$j<$retain_pos[$i]['sum'];$j++){//按照匹配到的次数进行for循环
$num = $retain_pos[$i]['key'][$j];//取出每一次对应的数据的键名
$output_arr[] = $resource_arr[$num];//从原始$arr中获取键名对应的键值,压入$array_result中
if(count($output_arr)>$number-1){//如果匹配超过$num个,那就退出循环,因为拿来展示的数已经足够
break 2;
}
}
}
}
return $output_arr;
}
}
$obj = new DataMatch();
$data = include(c('search_file'));
$str = $_GET['name'];
if(!empty($str)){
$obj->setData($data,$str,c('show_num'));
$obj->setPriority(c('priority'));
$result = $obj->search();
}else{
echo '传入的待匹配值为空';
}
// echo '<pre>';
// print_r($result);
?>