thinkphp一句话疑难解决笔记 2

php中的_ _call()方法?
它是php5后为对象 类 新增的一个自动方法. 它会监视类的其他方法的调用, 当调用类的不存在的方法时, 会自动调用类的__call方法. tp的 "命名范围调用"就是使用的 __call机制.如\(User->scope_name()->select(); 它带两个参数,第一个是 调用的不存在方法的名称\)funcName, 第二个参数是 由不存在方法的参数 组成的一个数组$args. **特别注意的是, __call要定义为 public 访问级别,即使是 本 类的方法 来调用... Error: Access level to Home\Controller\IndexController::__call() must be public(as in class Think\Controller) **

php类中的特殊成员和特殊方法?
特殊成员用一个下划线表示, 如$_validate... 特殊方法用两个下划线表示,如function __construct, __call() __destruct等. 这些特殊成员 通常不会直接调用, 而是作为"隐式"的东西被 "自动"使用.

使用命名范围scope, 是一个比较好的思想,可以 简化 连贯操作的多次书写...

总结, tp的选择操作方式有四种:

  1. 传统的query方法;(相应的,execute是写操作方法...)
  2. orm方法: $User->field('name, score')->table('score')->where('class=一班')->select(); //包括scope方法.
  3. 动态查询方式: $User->getById('10'); $User->getFieldById('score', '10');
  4. AR方式查询: $User->find('8'); $User->select('1,2,10'); 所有的操作(包括查询, 赋值,修改等)都是通过对象 $User->score=100; $User->id=10; $User->save();
    实际应用中, 在满足要求 的情况下, 用最简单 的方式

设计数据库时, 参考"11个重要的数据库设计规则" Website: http://kb.cnblogs.com/page/138526/,  英文原文: 11 Important Database designing rules syllabus: 课程
3nf: normal formum. jiushi : 原子性(根据实际需要来确定,不一定越细越好, 如果过多使用substr,则不是合适的...), 完全依赖主键而不是部分依赖; 控制派生列(存在依赖非主键的列, 如统计列, avg,sum等列, 也就是控制 冗余, 也不是绝对的, 如果为了性能, 可以适当冗余). 解决denormalization 扁平化处理的方法是: 将不符合3nf的数据,包括 不符合1nf 2nf的列, 提取出来,单独建一个表, 然后通过外键 关联.

many_to_many时, 要通过中间表进行关联, 中间表一般包含表自己的自增id字段(这个不是必须的), 两个表的主键字段.在tp中中间表的命名规则是: 表前缀_主表_关联表.

在设计表字段结构时, 应尽量避免使用NULL字段. NULL字段会额外增加存储空间, 而且mysql对null字段会做一些特殊工作,不会对null字段进行索引, 所以,这些都是不利因素, 除非你确实要存储null值, 否则, 都应该显示的声明字段为not Null.

通常情况下,模型类是不需要自己定义的,除非你要 在模型中使用自己的业务方法, 使用其他附近功能和规则,如$_validate, $_link等.

一般主键字段,不要光光的只写一个id, 最好是把前缀都带上,如uid, gid, article(aid)等.

namespace是指当前定义的类所在的文件, 所在的目录, use是指你要继承的基类所在的文件路径(不带.class.php后缀的)

表的别名不用as吗, 字段的别名才用as?

thinkphp的D,M方法的对象\(User, 本身是一个Model对象, 其中包含了很多 成员 属性, 所以才可以用 -> 方式输出字段属性的值,和用AR的方式来add,save等. 但是,如果要得到\)User->select后的结果数组, 则要用另外的变量去接受它. 如$result = \(User->select(), 这样\)result就是数组了.

关于stdClass?
stdClass是php的保留类是顶层基类,本身无属性和方法,是所有类的派生的开始.当你需要传递属性而又不需要很正式的例如class SomeClass extends...方式来定义类时,就可以这样使用stdClass.(注意php的类不可以动态地添加方法, 所以\(obj=new stdClass()后, 只能有\)obj->attr='some', 而不能有$obj->method()😉

php的对象都是指针, 传值/传参/调用时都是地址引用,即使像$obj2 = $obj1, 这样也是传地址引用, 可以节省资源,是直接修改对象本身,而不是拷贝. (而数组传值时,是另外生成一个拷贝,而且unset(数组)仍然占用内存 )

编辑器的代码 字体大小, 9-10就比较合适了, 大了反而不合适

thinkphp用户自定义的 函数, 文件/库的名称, 一定是 function.php, 否则不能自动加载, 在Controller中就不能直接使用. 不能使functions.php, 这个 functions.php是框架的 函数库, 是为了跟用户自定义函数库相区别的!!

关于3.2.3中使用namespace后,出现的找不到类stdClass的问题?

使用namespace后, 默认的,你就只能使用 \home\Controller目录下的类/函数了.这也正是 命名空间的功用. 但是你也不能把像new stdClass()之类的语句放到namespace前面去, 因为"namespace declaration statement has to be the very first statement in the script". 你也不能在Home\Common\function.php中去定义class stdClass, 因为他会报重复声明: redeclare. 解决方案是: 在命名空间中,要使用:

  1. 要使用php的内置类, 或其他第三方没有使用命名空间的类, 要使用反斜杠 "\" 引起,表示 php的根空间 **而不是 thinkphp的相对目录或相对空间.
  2. 如果要使用其他有命名空间的类, 则使用import或vendor方法...

在windows下, 是不区分stdClass的大小写的, 也不区分是否加()号. 如$obj = new \sTDcLass;是可以的.


在App/Runtime/Cache/Home目录中保存的缓存文件是控制器的方法,还是View视图的模板?
只有 当方法中 调用show,和display方法时, 才会生成缓存文件,也就是说,可以认为cache下的缓存是针对视图模板文件的,如果没有模板,即使在方法中写再多的东西都不会生成缓存文件的.

DATA_PATH, 是存储文件数据(缓存)的位置,在 ./Application/Runtime/Data/下

函数中的对齐,通常只是针对 “(可以是 任何位置)多个挨着的 赋值语句,才考虑等号对齐”

S和F的区别?
S缓存 主要是用在频繁在服务器端需要使用的数据且不会频繁更新的, S是保存在服务器内存中的,所以你在DATA_PATH.'data/'下是看不到文件的.F则是以缓存文件的方式保存的. $data="123"; F('passwd', $data);echo F('passwd');

客户端/浏览器, 是以 "其他, other" 来访问服务器的, 绝不是以root, 也不是以apache身份来访问的. 因为在linux下要能够顺利地运行thinkphp的话, 要 将Application的权限设为 other+w, (不一定设为777), 最重要的是, 要把 selinux设置好, 或者 把selinux禁用掉. 有时,也要考虑防火墙的问题.

linux下, 使用 <php>....</php> 标签时,提示, used undefined function \Think\Template\simplexml_load_string(), 是因为没有安装 php-xml包...

在convention.php中, 虽然配置了 'SHOW_ERROR_MSG => false, 和 ERROR_MESSAGE => '...' `, 但是由于 配置了 'APP_DEBUG => true', 所以要加载 Conf/debug.php, 因此, debug.php中的配置 'SHOW_ERROR_MSG' => true 把前面的配置给覆盖了. 而convention.php中的配置正好是 在部署时的配置.


异常中的trace?
是在 出现异常时, 页面中加入trace信息, 不同于专门的 页面trace设置

在thinkphp中, 是把 错误 = = = 异常, 把错误当作异常来处理的, exception=error

页面trace?
是指在页面右下角出现一个图标,然后可以点击查看, 基本,文件,debug, sql等页面trace 调试信息... 需要设置 'SHOW_PAGE_TRACE' => true, 'TRACE_PAGE_TABS'=>array(..),...

trace方法?
则是手动的/自定义的, 你想输出/查看 什么信息的 输出一些 变量信息, 它是要结合 页面trace来使用的, 因为, trace(你要查看的变量\(var/\)sql等变量, '条目行 标签', '指定 属于的, 显示在其下的 ,要在页面trace上显示的分类标签'). 默认的是显示在 debug标签下. 所以, 如果你没有设置页面trace, 你是看不到的.

总之,这些trace其实是没有多少用的, 真的要 调试的话, 直接就 dump了


套路: 表前缀通常用数据库名, 模型对象名称就用对应的表名称. 作用是 方便, 清晰。

对于函数, 一般都是return $var; 返回一个变量, 并不返回“return echo $var”, 这样方便你自己使用, 你可以用echo去输出, 也可以用于 表达式中使用。

posted @ 2016-11-24 14:29  noitanym  阅读(438)  评论(0编辑  收藏  举报