tp默认的编码是utf-8
Runtime中的Cache和Logs都是分模块的,因为在应用app下可以有多个模块,但是 公共模块和Runtime模块只有一个, 所以, Runtime要包含各个模块的内容. 包括home和admin的内容: 比如:Cache/Home/....php, Cache/Admin/...php, Logs/Admin/...log , Logs/Home/....log
不管是任何一种语言, 都要养成相同的, 严格严禁的编程习惯, 比如变量在使用前, 要事先声明并初始化。
php语言的换行并不像 有些等语言那样,必须用回车来分割。 你可以在同一行任意的写多个语句。只要中间用 空格进行分割就好。比如设置
define('APP_DEBUG', false)
生成的common~runtime.php中的内容就是全部写在一行内的。
调试和非调试的区别是: 仍然还是有Runtime目录及其下面的Cache、Data、Logs/Temp等目录; 但是在Data和Logs下就没有记载日志了
但是Cache缓存还是有的; 当时要多生成一个 common~runtime.php这个 通用函数的运行时版本。
如果你的环境足够安全,比如在linux服务器上开启selinux时, 不希望生成目录安全文件,可以在入口文件里关闭目录安全文件的
生成:define( 'BUILD_DIR_SECURE', false);
注意那个 define('DIR_SECURE_FILENAME', ‘default.html’)
是指定生成的安全文件的名称。是否要生成
用build。
在tp中, 表示生成/的意思用的是 build这个单词.比如: define('BUILD_CONTROLLER_LIST', 'Index,User,Foo');
等
关于配置文件?
一个应用,又叫做“项目”
有多种配置文件,比如模式配置文件(通常都是普通应用模式),状态配置文件(软件的应用场景,比如办公室和家里),扩展配置文件(是对相应配置文件的扩展)
配置文件加载的顺序是: 惯例-》应用公共 -》 调试 -》模块 -》状态 -》扩展 -》动态配置(文件)
而实际上,根本就不会搞这么复杂, 整这些没用的东西,就是最普通的 “公共应用配置文件”和 ‘模块配置文件'就好了
其他的只是了解:
- 动态配置,是指不放在配置文件中,而是直接在代码中,用C函数来配置的,当然也不会写入到配置文件中,因此只是在当前执行期间、当前请求中有效
- 批量配置,是指配置项不是一个一个的指定,而是用数组来指定,当然这个也是动态配置。比如:
C($user_config);
- 扩展配置,是针对每一种配置文件都有效的,比如对公共配置,对模块配置都可以。主要目的是便于 集中/分门别类的管理.比如:将前台和后台都用到的用户配置,单独放在一个配置文件user.php中,然后并入到公共配置文件中:
在App/Common/Conf/config.php的内容中, 加入: 'LOAD_EXT_CONFIG' => 'user', 当然App/Common/Conf/下要放置 usr.php配置文件
- 注意的是,所有的配置文件, 最后都归入到全局配置中 都统一使用
C('config_name');
来获得
最后,C函数的三种用法:
- 获取配置值;
- 动态设置配置;
- 相当于三元运算符的
获取或设置默认配置值 C('CONFIG_NAME', null, 'value_when_null'
- 配置参数的名称中, 不能包含点号和特殊字符,因为C函数中的点号(点语法)是用来获取二维配置参数的
echo C('APP_NAME'), ' ', C('USER_TYPE');
C('name', 'anna');
echo C('name');
$user = array(
'usr' => array('age' => 20, 'addr' => 'China', 'gender'=>'male'),
);
C($user);
echo C('usr.age'), ' ', C('foo', null, 'not this para');
多个入口文件和多个模块的问题
在Application下的目录都叫"模块", 比如" Common公共模块, Home前台模块, Runtime运行时模块" 等
关于模块的设置操作有:
- Application下的所有模块默认都是可以访问的.
- 可以设置禁止访问/不可以访问的模块:
'MODULE_DENY_LIST' => array('Common', 'Runtime', 'Api')
等, 不可访问的模块主要是用来内部调用, 放置公共接口或函数给其他模块使用的. - 同样的道理, 可以设置 允许访问的模块:
- 还可以设置单模块方式:
'MULTI_MODULE' => false , 'DEFAULT_MODULE' => 'Home'
对 同一个应用 或项目, 虽然是单入口方式, 但是 并不是说只能有一个入口文件, 你可以用 多个入口文件, 比如 index.php, 或 admin.php 入口文件.
- 一个入口文件, 同时 只能绑定 一个模块, 如果企图想 绑定多个模块, 即用逗号来分割的话, 在创建模块的时候, 会把这个逗号看成是模块名字的一部分, 从而生成中间有逗号的目录, 但是在 controller/中的IndexController.class.php中就会报错
C:wampwwwAPPAdmin, HomeController 中的IndexController.class.php 文件:
namespace Admin, HomeController; // 这里会报错! 把 Admin,Home看成是一个整体
use ThinkController;
- 因此, 想要一次性地 在同一个入口文件中, 生成多个模块, 是不可能的, 只能是 一次/ 一个入口文件 只能生成一个 模块. 如果要生成多个模块, 必须用多个入口文件
- 而且, 如果想要在 默认生成的模块名称是 Admin的话, 你不能在 入口文件中 设置
define('DEFAULT_MODULE', 'Admin');
只能在 convention.php中设置'DEFAULT_MODULE ' => 'Admin' ,
- 因此, 要生成 Admin目录的话, 可以 再 复制一个 index.php 文件到 admin.php, 只是修改一下 BIND_MODULE就行了.
admin.php:
define('BIND_MODULE', 'Admin');
define('APP_PATH', './Application/');
require './ThinkPHP/ThinkPHP.php'; 注意, 凡是 没有 引号的 字符序列都被看做是 "关键字", 比如, define, true, if, while , CONST_NAME 等
在入口文件中, 绑定模块的作用, 有两个: 一个是生成 指定的 模块 , 如Admin, 不再是默认的模块; 第二, 是可以在访问的时候, 自动/ 默认的就是 那个模块路径下的控制器和操作了. 就不必再写模块名称了, 比如: http://ServerName/(这里不能再写Admin模块名了)/Index/index/var/value
同样的, 绑定控制器 到当前入口文件: define('BIND_CONTROLLER', 'Index');
那么 访问地址就是: http://localhost/index/var/value
模块名称和控制器名称都不必(也不能写了)写了
配置时, 一定要注意两种格式和方式的区别, 有的配置方式是 define('...', '...')
, 而有的配置方式是用 数组项来配置的, 形如 : 'MODULE_ALLOW_LIST' => 单个的内容用单个单词, 如false, 'App_Name', 多个的内容用 array('Home', 'Admin');
url的格式, 强烈不推荐使用类型链接, 即用? var=value的方式, 而是使用 /var/value, 用/隔开的链接才是有利于搜索引擎抓取的
-
vim下的搜索命令是: vimgrep, 简写就是vim. 关于这个全局搜索的用法根grep的差不多, 但是, 如果你直接使用 grep的话 就会在vim的外部执行,
根vim内部就没有什么关系了, 所以, 要使用vimgrep, 这样搜索的结果会显式在 vim的quickfix窗口中 -
关于搜索的格式, 跟grep差不多:
vim /搜索内容/ 搜索范围
只是跟grep不同的是, 搜索内容要用 /... / 阔起来.
范围的表示方法:
- % 表示当前文件
-
- 表示当前目录(不包含子目录)
- ** 表示当前目录及其下的所有递归 子目录
- 可以使用多个路径, 用空格来隔开.
-
搜索和quickfix窗口结合使用?
你可以直接的/单独使用vim命令来搜索, 这时候, 搜索结果是保持在另外一个缓冲区,但是他不会被 直接显示出来 当然你可以用 cn, cp 来切换
但是毕竟不是很直观, 要显示更直观, 就要结合copen命令, 将搜索结果用管道命令 传递给copen打开. 即:vim /tags.php/ ** | copen
-
注意, 如果在vim冒号命令的前面 指定了范围, 比如 %, 比如1,10等这些, 就表示的是 对当前缓冲区中的内容进行操作, 就不会 "临时地"返回到控制台. 而是直接对当前缓冲区进行操作.
-
:%!nl
跟set nu
的区别是: 前者的行号是作为这一行的内容而存在, 而后者的行号不是内容的一部分.
vim中如何引用xdebug的函数命令?
是通过 冒号命令中的 :python ..., 这里好像一定要加python, 否则就是错误的.
命令中, 使用的对象是debugger, 不是 xdebug.
比如: 要单步执行调试命令, 使用的命令是: :python debugger.step_into()
逐过程执行: : python debugger.step_over()
杂项
php跟其他语言的变量是一样的, 唯一的区别是: 只是在前面加了一个 dollar符号
空字符串和null的区别? 当要操作的变量是一个字符串的时候, 用''赋初值, 当变量是 数组或对象(实例)的时候, 用null赋初值.
**Think**核心的基本组成包括两个部分, 一个是系统核心xx 类文件, 一个是系统的扩展驱动目录, 里面通过Driver来组织.
一个反复强调的常识了: 全局方法 , 才用直接调用, 前面不用任何对象或类, 直接写. 如果是不是全局方法/函数, 是属于类/对象的方法, 那么就必须通过类/对象 用(:: 或->) 来引用/调用.
php的类的注册?
-
Think目录及 其子目录下的类, 都可以自动注册, 不需要再用 'AUTOLOAD_NAMESPACE' 来指定. 但是在 定义/引入这些类的时候, 要正确 书写 命名空间, 因为, 系统就是通过 命名空间来找到/定位这些类, 实现自动载入/自动注册的.