tp框架中的一些疑点知识-1
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:\wamp\www\APP\Admin, Home\Controller 中的IndexController.class.php 文件:
namespace Admin, Home\Controller; // 这里会报错! 把 Admin,Home看成是一个整体
use Think\Controller;
- 因此, 想要一次性地 在同一个入口文件中, 生成多个模块, 是不可能的, 只能是 一次/ 一个入口文件 只能生成一个 模块. 如果要生成多个模块, 必须用多个入口文件
- 而且, 如果想要在 默认生成的模块名称是 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' 来指定. 但是在 定义/引入这些类的时候, 要正确 书写 命名空间, 因为, 系统就是通过 命名空间来找到/定位这些类, 实现自动载入/自动注册的.
tp框架中的一些疑点知识-1的更多相关文章
- tp框架中的一些疑点知识-7
mysqli是用面向对象的,所以用箭头对象语法, 而mysql是用C语言面向过程写的, 所以用的都是php全局函数 式的写法. tinkle: 叮叮当当的响; (口语)一次电话, i will giv ...
- tp框架中的一些疑点知识-5
关于vim中的缓存区的前后bp和bn的界定 通过命令ls可以看到 缓存区的 排序. 最开始打开的文件排在最上面, 序号最小. 那么它们就是 更 前 的缓冲区. 序号更前的用bp, 序号靠后的用bn. ...
- tp框架中的一些疑点知识-2
tp中有三种常量: 预定义常量, 这个设置后不会随环境的改变而改变的,比如'URL_MODEL' => 1 注意是 model, 不是 url_mode 路径常量, 也不会随环境的改变而改变的, ...
- tp框架中的一些疑点知识-3
rewrite就是伪静态, 伪静态就是 rewirte, 可以把入口地址隐藏掉. 兼容模式就是 普通模式 和 pathinfo模式的 结合, 前面是普通模式 ?s= , 后面的 模块/控制器/操作和参 ...
- tp框架中的一些疑点知识-8
NaN是Number对象的一个属性, 表示一个特殊值, 表示不是一个 数字, 引用/赋值时, 要使用: Number.NaN 判断 一个值是不是 NaN, 用 isNaN() 函数, 它是一个js的全 ...
- tp框架中的一些疑点知识-6
vim自带一个目录浏览器,使用命令:E就可以调出来,实际上就是浏览器的名字就是"网络读写"netrw vim也自带了 补全功能, 启动键是 "ctrl_N" 或 ...
- tp框架中的一些疑点知识-4
$_SERVER的几个元素: script_name脚本名称, 是指这个脚本文件本身的文件名, 通常只是 : /index.php path_info: 是从控制器/操作方法开始到最后的内容,包括路径 ...
- tp框架中的一些疑点知识--cookie和session的配置
不同的浏览器采用不同的方式保存Cookie. IE浏览器会在"C:\Documents and Settings\你的用户名\Cookies"文件夹下以文本文件形式保存,一个文本文 ...
- TP框架中关于if、else 分支结构逻辑错误
TP框架中关于if.else 分支结构逻辑错误 代码中没有任何错误 将注释往下一行就可以解决 造成问题的原因: TP框架中 想分配变量可以使用assign方法 在[模块]中: $this->as ...
随机推荐
- EL的隐含对象 (二)【访问作用域范围的隐含对象】
在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope.requestScope.sessionScope和applicationScope.应用这4个隐含对象指定所要查找的标识符的作用 ...
- 解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集
character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. characte ...
- C语言---数据结构(内建,数组,自定义)
数组是一组有序数据的集合,每个元素都属于同一个数据类型. 一维数组的定义: 类型符 数组名[常量表达式] 常量表达式中,可以包括常量和符号常量,int a[3+5]是合法的.但是不能包含int a[ ...
- windows批处理定时关机
2017-04-11 windows bat文件可以简化很多cmd命令,为我们提供很多方便.今天介绍定时关机的批处理代码实现: 我们知道windows下的定时关机可以通过shutdown命令实现,如果 ...
- 定时调度任务quartz
依赖 <!-- quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> < ...
- MySql 查询表中字段的数据类型
[1]MySQL中查询某表中字段的数据类型 (1)DESC 表名: (2)DESCRIBE 表名: (3)SHOW COLUMNS FROM 表名: 应用示例: DESC cfg_acct_free_ ...
- 基于Kubernetess集群部署完整示例——Guestbook
目录贴:Kubernetes学习系列 本文依赖环境:Centos7部署Kubernetes集群.基于Kubernetes集群部署skyDNS服务 该示例中,我们将创建一个redis-master.两个 ...
- java中的神奇"this"
java中的神奇"this",神奇的原因事它能不用new就可以直接创造一个对象出来,后来研究发现,其实java的“this”使用时,也是"new"了一个当前的对 ...
- hihoCoder #1106 : Koch Snowflake 微软苏州校招笔试(1月17日)
描述 Koch Snowflake is one of the most famous factal. It is built by starting with an equilateral tria ...
- SQL SERVER镜像配置(包含见证服务器)
镜像简介 重要说明:保持数据库镜像运行.如果您关闭数据库镜像,则必须执行完全备份并还原数据库以重建数据库镜像. 一. 简介 SQL SERVER 2005镜像基于日志同步,可良好实现故障转移. ...