thinkphp一句话疑难解决笔记 3
错误调试, E($msg)?
这个是tp内置的E 方法, E 函数. 它是tp抛异常 的另外一种方式. 默认的异常处理方式是, 在 框架下的 ThinkPHP/Tpl/think_exception.tpl, 其中的提示消息是: \(e['message'], 而 E(\)msg)的使用场合是: 抛自定义异常消息: 如果你不想显示系统默认的 \(e['message'], 那么你可以用 E 方法,显示自定义的异常消息. 而实际上, E方法,还是走的异常 途径, 它是: `E(\)msg, \(code=0) { throw new Think\Exception(\)msg, \(code); }. `就是说, 如果你判断某个条件或执行出错, 你可以自己手动抛异常, 只是异常的提示消息由E方法的第一个参数确定, 当然不一定是\)msg变量名. 后面的$e['file', 'line', 'trace']等, 跟think_exception.tpl是一样的.
php本身就有异常类, \Exception, 基本的使用方法是, 直接抛出异常 throw new Exception($except_msg) , 同样会显示异常消息和trace信息.....(如果不处理, 将会导致程序终止, 如果用 catch...处理则不终止). 而thinkphp的异常处理则是, 直接继承(实际上就是利用php原生的exception类), 在显示页面, 则做了一些包装而已.
抛异常时, 是 throw new \Think\Exception(\(msg,\)code);, 注意写模块时, 要加上根路径, 如果不加, 就表示是当前路径(可能是当前模块...), 如果加上,表示是根路径, 而系统默认的根路径就是 THINK_PATH.'Library/', 这个就正好!
性能调试,查看代码运行时间, 和内存占用情况?
G
模型调试, 查看sql语句和数据库错误?
如果要判断 “常量”是否dingyi, 使用 defined, isset是判断变量的,它后面要跟 $变量的, 如果用 isset(__FILE__)
就会报错。
__FILE__, __LINE__
, 的性质:不是常量,因为用 defined(__FILE__)
判断会返回 false, 也不是普通变量, 因为用 isset(__FILE__)
来判断会返回语法错误, 他是php语言自己在系统内部定义的 全局变量, 只可以在php脚本程序的函数 中使用! 表示当前使用这个 全局变量的 文件(跟包含/不包含无关)本身的 在服务器上的物理磁盘上的 绝对路径。
---* IpLocation的用法 *---
Wry ['rai]:讽刺的,挖苦的;扭曲的,歪斜的: with a wry smile, wry face, wry nose, make a wry face.
QQWry 可以是一个php扩展,用来读取QQWry.dat数据文件。
QQWry.dat是彩虹QQ外挂文件使用的 显IP地址的QQ
将qqwry.dat的扩展名修改为mdb, 用access打开时提示输入密码:...
QQWry.dat文件,分成:文件头,索引区,记录区. 由于记录不是等长的,所以不能直接通过记录区查找到记录,要通过索引,才能查找到.
---* IpLocation的用法 *---
获取位置/地址的方法是: getlocation, 注意 中间的location的开头字母l, 不用大写的.
默认的ip地址库是UTFWry.dat, 如果不是, 则要在 new IpLocation('这里写上 qqwry.dat数据库文件').
不用去专门找 utf-8的编码的dat文件, 如qqwry.dat也可以, 它是gbk编码, 把信息取出来后, 用iconv作一次转化就可以了...
开启文件支持模块, 是php的扩展, 名字叫 fileinfo, 不是finfo, tp提示说, 为了更好的使用文件上传功能, 建议服务器开启 finfo模块。
对比记忆 文件上传和图片处理类:
都是先创建一个对象, 然后设置配置, 最后引用 一个动作方法: 上传的动作 函数是: uploda(), 图片的动作 函数是: crop(...)/thumb(...)/water(...)/text(...)-> save(...). 最后,返回的结果不同: 上传返回的是 由上传文件的信息(即使是一个) 组成的数组, 图片动作返回的是 对象本身 $this(包括通常最后的save方法), 所以支持连贯操作.
seliux的配置命令中,是 enforce, 不是force!
常量的定义方式, 全局常量和 类里面的常量定义方式是不同的: 全局的用 define(CONST_NAME, value). 类里面的就不能用define了, 而要用 const IMAGE_THUMB_SCALE
我觉得很无语的是, dw的cs5,(cs5比cs3好用), 安装时放在桌面的快捷方式, 不能删,也不能改名,也不能移动位置,甚至你将快捷方式移动到开始菜单后再放到桌面上来, 都会失效!(或许是删除了注册项什么的? 一旦检查到移动位置, 就令快捷方式失效吗?)
\(_SERVER的几个容易混淆的元素?
\)_SERVER['SCRIPT_NAME'], = [PHP_SELF], 表示只是(脚本的本身, php文件自己)文件名称本身: /index.php
['SCRIPT_FILENAME'], 是完整的包括文件路径的名称: C:/wamp/www/index.php
protected function templateContentReplace($content) {
// 系统默认的特殊变量替换
$replace = array(
'ROOT' => ROOT, // 当前网站地址
'APP' => APP, // 当前应用地址
'MODULE' => MODULE,
'ACTION' => ACTION, // 当前操作地址
'SELF' => htmlentities(SELF), // 当前页面地址
'CONTROLLER'=> CONTROLLER,
'URL' => CONTROLLER,
'PUBLIC' => ROOT.'/Public',// 站点公共目录
);
文件上传,有两个数组,不要搞混了: 一个是上传文件的配置数组, 一个是上传文件信息的数组.即使是同名的key含义也不同, 前者表示属性的配置, 后者表示属性的获取.
即使你不设置upload的任何上传配置, 也会有默认的上传配置信息, 那就是Upload类的私有成员: private \(config, 里面有默认的配置信息, 如: rootPath='./Uploads', savePath='', saveName=array('uniqid',''),等等. 而 Upload在实例化的时候, 构造函数会要求输入一个用户自定义的配置, 然后会将类对象默认的\)config和自定义上传配置进行合并...
public function __construct($config=array(),...){
$this->config = array_merge($this->config, $config);
}
php虽然没有类型强制规定, 但是今后规范类型是一种趋势, 所以, 现在可以通过初始化的方式, 来变通的规范变量类型. 初始化的方式根据你想存储的数据类型来决定: $arr=array(); $str=''; $num=0; $obj=null;
实例化Upload类的时候, 可以使用完整的类路径, 也可以使用 命名空间, use关键字指的是 哪一个类文件, 而namespace指的是目录.
U方法, 虽然指定的是操作方法, 但是生成的是具体的操作方法名称对应的html文件,如: U('uplad'): /index.php/Home/Index/upload.html
数组虽然可以相加, 如arr_a + arr_b, 但这种运算通常没有实际意义
对于数组array('name'=>'John'), 前面的叫 索引/index/key, 后面的叫值. 分成数字索引和字符串索引.
数组可以用数字索引和字符串索引混合使用! 混合时,数字索引不管前后的字符串索引, 仍然从0开始编号.
$arr=array('name'=>'Jonh', 10,20, 'age'=>20);
dump($arr);
array
'name' => string 'Jonh' (length=4)
0 => int 10
1 => int 20
'age' => int 20
注意: array_merge是有前后顺序的, 对于字符串索引, 相同名称的key, 则用后面的key-value来覆盖前面的. 没有重复的, 则按第一个先排, 后面的后排进行组合.
思想:
php, thinkphp是解释型语言, 即使如果某个方法/函数中有代码错误(如类不存在), 只要你当前页面对应的控制器的方法中, 没有错误,在运行当前页面的时候, 都不会报错.(比如 请求index页面时, 不会去检查upload方法是否有错的! ) 只有在client去请求另外的页面, 这个另外的页面有错的时候, 才会报错. 不像编译型的语言, 在运行前, 就进行了整体的代码检查....
tp3.1里面, 由于没有使用namespace, 所以要使用org类库, 要使用import, 而tp3.2中, 使用了namespace, 所以就不用import, 而是用use...
tp中, 要给模板传递变量, 可以使用多个 语句, 分开传递多个变量, 并不是 只能传递一个变量, 也不必 把多个变量, 强迫的放到一个数组中来传递.
写代码, 首先要记代码.开始记代码
元素的标签就是前面的html元素:getElementByTagName('span'):
var tab_tit = document.getElementById('think_page_trace_tab_tit').getElementsByTagName('span');
var tab_cont = document.getElementById('think_page_trace_tab_cont').getElementsByTagName('div');
ThinkPHP的框架目录下:
除了Common, Conf,Lang, Library, Mode, Tpl目录外, 还包括一个授权文件license.txt, 一个logo图片logo.png, 一个框架的入口文件。
根目录下的Public目录是放: 项目的资源文件的,包括css,img, js等。
而ThinkPHP框架下的Tpl目录,是存放框架内的一些错误, 提示, 跳转信息的模板文件,包括: dispatch_jump.tpl, page_trace.tpl, think_exception.tpl
网站根目录的应用程序的入口文件是: /index.php
tp框架的入口文件是:ThinkPHP/ThinkPHP.php
其实, 写php文件, 也不大可能蒋php和html完全分离, 有时甚至很多时候, 需要将php和html混合书写,一个原则: 凡是属于php代码编程的内容,包括变量,大括号等放在php的括号中, 其他直接放在文件里。。。