Category: PHP

  • PHP高级——autoload(类的自动加载)机制

    通常我们在引用外部 class 时,会直接使用 include(include_once) 和 require(require_once) 函数来把 class 文件包含进来。这种做法在大型项目中并不可取,原因是:大型项目需要引用更多的 class 文件,从而使得代码难以维护且降低整体性能。因此PHP官方提供了这样一种解决方案——autoload 机制。 PHP内部的 autoload 机制: php内部提供两种方法来实现自动装载机制,一种是使用用户自定义的 _autoload 函数。另外一种就是设计一个函数,将执行器全局变量函数指针 autoload_func 指向它,这通常使用C语言在PHP扩展中实现。 如果既实现了__autoload()函数,又实现了autoload_func(将autoload_func指向某一PHP函数),那么只执行autoload_func函数。 autoload 发展史 : 早先,PHP5 在使用一个类的时候,如果这个类没有加载,就会自动运行 _autoload 函数,我们需要自己先实现一个 _autoload 函数,这个 _autoload 函数需要做三件事:根据类名得到实际类文件名,确定该类文件的实际磁盘路径,加载该类文件。这种方法的缺点是:在面对大量的类文件时,该函数编写会变得很复杂,相较于原来维护可能会方便一点点,还是会影响整体性能。 目前,我们采用的是 SPL autoload 机制(Standard PHP library)。这种机制是将函数指针 autoload_func 指向 spl_autoload 或 spl_autoload_call 函数来实现两种加载方式。 spl_autoload($class_name,$file_extensions) 通过使用 spl_autoload_register() 就可以将 autoload_func 指向 spl_autoload()。 接受两个参数,参数一是类名,参数二类文件的扩展名。该函数和 require/include 差不多,不同的是可以指定多个扩展名。不推荐 spl_autoload_call()…

  • thinkphp3的小问题

    虽说thinkphp6都已经出来了,但是还是有几个项目是thinkphp3写的,有时候还需要维护增加新的功能,因此遭遇到了很多小问题。 最重要的一点:debug 设置为 false;其次,如果出了问题,首先把 Runtime 目录全部删除。然后,再细细排查。 凡是在controller下引用其他非框架自带的类,一定加 \ ,eg: new \ReflectionFunction(‘xxx’)。原因:TP默认在controller实例其他类,默认会加上命名空间!!! 数据库的报错显示,有时用M()->getError(),有时又得用M()->getDbError(); 模板里面使用 __SELF__,这个模板变量在第一次生成缓存文件后就是固定不变的了,用且谨慎。 同一个方法里,I(‘status’) 不能同时获取 get/post值!!!request.status 可以获取到; 自动验证里验证规则 require 对值为数组的字段会验证失败。 做一个知世故而不世故,历圆滑而弥天真的人。 做到温暖,真诚,懂得换位思考。 —— ?

  • composer——现代PHP的基石

    composer设置,简介

  • 9102年了,你应该有一个属于自己的工具包

    当我拿起画笔, 我就是上帝。 —— 嗯,当我捧起我的笔记本的时候,我也是上帝 每次开发的时候,你是不是都会用到自己定义的函数,他们是一个单独的文件么?如果不是,而你还在每次创建新项目的时候复制粘贴,那就真有点out了。毕竟,现在都9102年了,php都快要发布带有 JIT 的 8版本了。 先说说目前通用的思路,把自己经常用到的的函数扩展为一个 composer 包,发布到 github/packgist 上。以后创建新的项目的时候,可以自动的引入该扩展包,就不需要自己每次都复制粘贴了,方便简单快捷呀。 举个栗子:这个工具包就很不错 yiranzai/php-tools 我的工具包内容: ts($var,true):打印美化工具函数,主要美化数组的打印,以及可以exit; remoteDownload($url,$path): 下载远程的文件保存于本地;