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的选择操作方式有四种:
- 传统的query方法;(相应的,execute是写操作方法...)
- orm方法: $User->field('name, score')->table('score')->where('class=一班')->select(); //包括scope方法.
- 动态查询方式: $User->getById('10'); $User->getFieldById('score', '10');
- 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的根空间. 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去输出, 也可以用于 表达式中使用。
thinkphp一句话疑难解决笔记 2的更多相关文章
- thinkphp一句话疑难解决笔记 3
错误调试, E($msg)? 这个是tp内置的E 方法, E 函数. 它是tp抛异常 的另外一种方式. 默认的异常处理方式是, 在 框架下的 ThinkPHP/Tpl/think_exception. ...
- thinkphp一句话疑难解决笔记
URL_PATHINFO_DEPR, depr表示 网页路径"分隔符",用"-", 有利于seo,注意是从 sername/index.php(开始的)/hom ...
- ThinkPHP真正疑难问题笔记
如何选择线程安全版本还是非线程安全版本: http://www.cnblogs.com/Alight/p/3389113.html(看webserver处理请求时, 使用的是多线程的方式还是 多进程的 ...
- 1 环境搭建_及参考资料介绍_ASM驱动开发疑难解决
1 环境搭建 > 这里和 周壑老师不同:大家觉得哪中适合当前的物理机,就配置那种. 如下: win7 32 位: vs 2010; visualDDk 驱动项目插件: V A --- 代码高亮 ...
- thinkphp疑难解决4
关于文件上传所涉及到的php.ini 中的一些配置: (以当前要设置的关键字开头...) 是每个上传文件所允许的大小, 默认的 upload_max_filesize = 2M, 如果超过了2M,_P ...
- ThinkPHP中疑难笔记
不但要记住核心的东西, 还要记住 相关的 东西: 如php cli的版本是 5.6.14 bulit: sep 30, 2015 tp中, 通常说的系统就是框架; 项目就是 "应用程序&qu ...
- ueditor 编辑器再thinkphp中使用 解决转义问题
在前台common.php文件中加入下面的函数就可以解决了 <?php //取消thinkphp里面的转义 if (get_magic_quotes_gpc()) { function stri ...
- 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
本人最近在使用spring事务管理的过程中遇到如下异常,导致服务端抛出500给前端,让搞前端的哥们抱怨我心里着实不爽,前前后后折腾了近半个小时才得于解决,今天就做个笔记,以免日后又犯这个错误.好了,错 ...
- 关于thinkphp框架中模型笔记
模型这一块,感觉学习的不是很清楚,单独水一贴thinkphp中模型的学习笔记. 0x01 模型类简介 数据库中每一张表对应一个模型,类名就是表名,类里面的成员变量就是列名, 把一张表对应为一个类,其中 ...
随机推荐
- 深入理解Thread.sleep的含义
转载一篇对sleep说的非常好的一篇文章,原文http://www.cnblogs.com/ILove/archive/2008/04/07/1140419.html 我们可能经常会用到 Thread ...
- docker
docker pull centos docker images docker run -ti centos cat /etc/redhat-release ##################### ...
- [django]windows下用Django,静态文件请求失败,出现UnicodeDecodeError
问题:windows下用Django,静态文件请求失败,出现UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 1: ...
- 报表移动端app如何实现页面自适应?
1. 描述 PC上制作好的报表,在手机端查看的时候,报表软件默认的自适应效果不尽人如意.例如,报表比较大,到手机上被缩的非常小,字都看不清等等.为此FineReport增加了选项可以手动控制报表在移动 ...
- NOIP模拟赛20161007
%hzwer http://hzwer.com/7602.html 题目名称 “与” 小象涂色 行动!行动! 输入文件 and.in elephant.in move.in 输出文件 and.out ...
- 嵌入式Linux驱动学习之路(十八)LCD驱动
驱动代码: /************************************************************************* > File Name: lcd ...
- AFNetWorking3.0源码分析
分析: AFNetWorking(3.0)源码分析(一)——基本框架 AFNetworking源码解析 AFNetworking2.0源码解析<一> end
- ASP.NET(C#) Web Api通过文件流下载文件到本地实例
下载文件到本地是很多项目开发中需要实现的一个很简单的功能.说简单,是从具体的代码实现上来说的,.NET的文件下载方式有很多种,本示例给大家介绍的是ASP.NET Web Api方式返回HttpResp ...
- 搭建一套自己实用的.net架构(1)【概述】
入园很久,一直默默的潜水,近来得空想写点什么. 思前想后,那就把自己平时没事干自己摘抄.引用.瞎写的一些东西写出来.帮助自己巩固一下,顺便请高手们指点一二. 我本人很懒 ,一些代码就是直接复制别人的劳 ...
- 详解mysql int类型的长度值问题【转】
mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最大宽度吗? 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道int(1),这个长度1并不代表允 ...