ThinkPHP5开发的正确姿势
操作方法的参数绑定功能
Request属性注入
用Request类的getInput方法替代file_get_contents('php://input');
永远不要在操作方法中(事实上是任何代码中)使用exit;
使用composer,是趋势 应用仓库并非必须;
把web根目录指向public目录而不是根目录;
资源文件不要放到public目录以外;
TP5完美支持PHP7,TP5正常运行需要PHP5.4+,建议版本为PHP5.6+;
不要使用普通URL模式访问;
tp5的方法如果是使用了驼峰命名,那么他内部会转化为下划线形式去找你的html.
eg:你的方法是 creatTeacher()
在找页面的时候就是 creat_teacher.html 而不是creatTeacher.html
moderl操作
连贯操作 WHERE
$User = M("User"); // 实例化User对象
$User->where('type=1 AND status=1')->select();
多次调用
$map['a'] = array('gt',1);
$where['b'] = 1;
$Model->where($map)->where($where)->where('status=1')->select();
多次的数组条件表达式会最终合并,但字符串条件则只支持一次。
CREATE 写
$Model = D('User');
$Model->create();
// 这里略过具体的自动生成和验证判断
$Model->add();
FIND 读
$User = M('User');
$map['name'] = '流年';
$User->where($map)->find();
// 读取当前数据对象
$data = $User->data();
FIELD
属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作。
$Model->field(array('id','title','content'))->select();
ORDER
order方法属于模型的连贯操作方法之一,用于对操作的结果排序。
$Model->where('status=1')->order('id desc')->limit(5)->select();
LIMIT
limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。
$User = M('User');
$User->where('score=100')->limit(3)->save(array('level'=>'A'));
用于文章分页查询是limit方法比较常用的场合,例如:
$Article = M('Article');
$Article->limit('10,25')->select();
表示查询文章数据,从第10行开始的25条数据(可能还取决于where条件和order排序的影响)。
$Article = M('Article');
$Article->limit(10,25)->select();
PAGE
page方法也是模型的连贯操作方法之一,是完全为分页查询而诞生的一个人性化操作方法。
$Article = M('Article');
$Article->page('1,10')->select(); // 查询第一页数据
$Article->page('2,10')->select(); // 查询第二页数据
GROUP
通常用于结合合计函数,根据一个或多个列对结果集进行分组。
支持对多个字段进行分组,例如:
$this->field('user_id,test_time,username,max(score)')->group('user_id,test_time')->select();
HAVING
用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据。
having方法只有一个参数,并且只能使用字符串,例如:
$this->field('username,max(score)')->group('user_id')->having('count(test_time)>3')->select();
JOIN
用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。
INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
join方法可以支持以上四种类型,例如:
$Model = M('Artist');
$Model
->join('think_work ON think_artist.id = think_work.artist_id')
->join('think_card ON think_artist.card_id = think_card.id')
->select();
$Model->join('__WORK__ ON __ARTIST__.id = __WORK__.artist_id','RIGHT')->select();
命名范围支持的属性包括: 属性 | 描述 -|-|- where |查询条件 field | 查询字段 order | 结果排序 table | 查询表名 limit | 结果限制 page | 结果分页 having | having查询 group | group查询 lock |查询锁定 distinct | 唯一查询 cache | 查询缓存
::与->
::调用静态方法 ->调用普通方法
静态方法
“静态方法是属于整个类的。”
1、用static关键字来修饰类的属性、方法,称这些属性、方法为静态属性、静态方法; static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为"类属性"或"类方法"。静态类不是不可以实例化,而是不需要实例化就可以用。
2、设计静态方法的目的是为了不用实例化对象直接用类名快速调用。
3、static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。
4、非静态方法可以访问类中的任何成员(包括静态),变量名||方法名前面不需要加上$。访问静态属性和方法,使用self::方法||属性,
5、static内部只能出现static变量和其他static方法(即静态方法不能调用非静态属性 。也不能使用self::调用非静态属性)!而且static方法中还不能使用this等关键字,因为它是属于整个类。静态方法内部调用其他静态方法,可以使用self::方法名称的形式来实现;使用self:: 静态变量名访问当前类的静态成员,变量名前面需要加上。
6、静态方法中,$this伪变量不允许使用,可以使用self,parent在内部调用静态方法与属性。
7、一个类的所有实例,共用类中的静态属性。也就是这个属性对于这个类来说是唯一的,不管实例化了多少个对象,只要它引用了一个静态对象,那么这些对象引用出来的值肯定是同一个。
8、声明定义一个静态函数很简单,它只需要在function前面加一个static关键字就可以了。 调用静态方法可以使用 “类名::静态函数名”的格式去调用,也可以直接实例化一个变量,然后使用变量名->函数名的方法调用。 由于静态方法不需要类的实例化就能够被调用,而普通方法和普通属性都必须先声明一个对象才可以访问,因此,在静态方法里面始终是不能使用普通方法和访问普通变量的。
strpos($name, '.') // 在$name中查找 . ,没有则返回false
$name = strtoupper($name); // 字符串转为大写
$name = explode('.', $name); // 在 '.'出把$name字符串打散为数组
$name[0] = strtoupper($name[0]); // 字符串转为大写
$_config = array_merge($_config, array_change_key_case($name,CASE_UPPER)); // 两个数组合并为一个 把$name中键名改为全小写或大写
$ext = pathinfo($file,PATHINFO_EXTENSION); // 以数组的形式放回文件路径的信息 只返回extension
parse_ini_file($file); // 解析一个配置文件(ini 文件),并以数组的形式返回其中的设置
simplexml_load_file($file); //把 XML 文档载入对象中
json_decode(file_get_contents($file), true); // 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 将整个文件读入一个字符串
function_exists($parse) // 在已经定义的函数列表(包括系统自带的函数和用户自定义的函数)中查找 $parse
str_replace($replace,$value,isset($_lang[$name]) ? $_lang[$name] : $name); //以其他字符替换字符串中的一些字符(区分大小写)