待续未完- 自己写后台内容管理程序 - 用tp框架 和 前台 jquery ui等写的
在日常开发中,我们主要使用的还是 php 的 内部的 语言本身提供的函数/常量,系统内部数组等。
为了和后面的tp框架提供的 “系统函数、系统常量”相区别,把php提供的东西叫语言函数、语言常量等。这也是不得已的叫法。
php的代码可以和html的代码镶嵌在任何地方(**注意是任何地方, 只有你想不到的地方... ** 比如 一个html标签内部的...比如 form action="", js中 href=" "),或者说在php文件中,js, css,php, html代码可以任意地混合,在任意位置放置任意代码都是可以的。
这些混合代码,其中的php部分在服务器端解析成html,然后发送到浏览器,所有的html, js,css等都是在浏览器端进行解析/渲染的。
var_dump 是语言本身提供的函数, 而dump是tp定义的函数。
print_r和var_dump主要是用来调试的,区别是后者还会显示变量的具体类型。而普通显示的话直接用echo就可以了
tp中一些关键点 的 澄清?
-
应用程序和框架的 位置和名称都可以 改变, 这是为了安全起见。只是默认保留index.php和Public
-
为了提供tp加载速度,将这些系统常量如APP_PATH(包括可修改的目录和名字),THINK_PATH等用绝对路径来表示。那些是绝对路径? 就是 realpath或dirname表示的目录
-
_ FILE _ 等是语言提供的魔术常量, echo它输出的是 完整的目录/加文件名, 而 realpath和dirname是 php语言函数:
- dirname是将文件名去掉后的目录, 而如果本身就是目录的话, 会返回该目录的上一级目录
- realpath "真实路径", 如果是文件的话, 等同于 FILE, 而如果是目录的话, 显示该目录本身..
=======================
tp中,虽然建议使用绝对路径,但是也支持/也可以使用相对路径, 如 ./ 和 ../ 等
在Windows下, tp 默认的 写 权限目录 仅仅限于 www目录下, 也就是说 如果是你修改项目路径在www目录下, 那么tp可以直接写, 就不需要你 自己手动去创建目录. 而如果是在 www目录的上级 目录之外创建 项目目录, 则要自己 手动创建 项目目录.
tp中的common 目录是公共模块, 里面主要放置的是 公共函数和公共配置文件两种内容。外面的common表示 "公共" 的意思, 里面层的 common表示 "通用函数目录"的意思.
目录安全文件?
在每个目录下都要一个空的index.html文件?
这是设置了目录的安全文件,有一个开关可以控制这个文件是否生成 define('BULID_DIR_SECURE' false);
如果开启了目录安全,还可以控制文件名和内容:define('DIR_SECURE_FILENAME', 'index.html,default.html');
define('DIR_SECURE_CONTENT', 'access denied');
如果是 APP_DEBUG = false, 则在Runtime 目录下 , 除了生成跟 调试模式下那些相同的内容和 目录外(比如 Cache, Data, Logs, Temp等), 还会多生成一个 common~runtime.php 文件, 它是一个已编译过的/压缩过的 /也可以读的php文件.
在任何文件中, 凡是 require的文件, 不管这个require语句写的位置放在哪里, (即使它 放在文件的最后,) 它的输出 也是 最先输出的.
系统中使用的那么多的 常量, 基本上是在 tp的 入口文件中 ThinkPHP.php定义的. 还有一些如果在应用入口文件index.php中没有定义的常量, 在这里定义了它的 默认值.比如....
- constant 和 define的区别?
const和define都可以定义常量; 常量不能再加$符号; 常量一旦定义后 就不能取消定义或者重新定义.
const 在5.3.0之前只能在 类class 的内部使用, 用来定义类的成员. 从5.3.0之后, 就可以用来在类的外部, (即任何地方了)都可以使用const. 而类的内部是不能使用define的
const和define都只能定义使用 简单变量, 不能使用 函数 或类.
最重要的是 const比define更简洁! const是一种语言结构, 不是函数, 而define是函数.在编译时 const更快.
TP中定义的常量有哪些?
THINK_VERSION
const URL_COMMON =0, URL_PATHINFO, URL_REWRITE, URL_COMPAT
EXT 类文件的后缀
路径常量:
php语言本身提供了8个魔术常量. 从大到小依次是: __NAMESPACE__, __CLASS__, __FUNCTION__, __METHOD__, __DIR__, __FILE__, __LINE__ , __TRAIT__
, 注意的是, 你在使用php代码表示路径的时候, 既可以直接的 单独的 使用这些魔术常量, 也可以使用 相关的函数, 也可以 使用 函数和 魔术常量的结合使用.
__FUNCTION__
既可以是 类内部使用, 也可以在 类的 外部使用; __METHOD__
只能在 类的 内部使用. 在类的内部使用时, __FUNCTION__
只返回函数名, 而__METHOD__
还返回类名.
为什么ThinkPHP.php文件中, 定义APP_PATHD的时候, 要使用 $_SERVER 数组中的 元素 script_filename
来获得, 而不是通过使用 相对路径, 或 __DIR__ 或 __FILE__
?
其实我改写了一下, 同样的也可以使用 __DIR__来定义 默认的 APP_PATH, 只是 使用 $_SERVER['script_filename']
是另一种实现方式而已, 但是要注意, 使用 __DIR__
的时候, 要使用其上一级目录才行 比如 __DIR__ .'../App/
, 否则会将应用 文件和目录生成在 ThinkPHP目录中.
但是 使用 DIR 的方式显得很 别扭, 所以 使用 服务器的 脚本文件名称 就比较 优雅??
要注意, 不管是否被包含, __DIR__和 __FILE__ ,以及 __LINE__
魔术变量, 总是指当前文件. 比如: 在 被require/include 的 文件中, __DIR__ 或 __FILE__
等, 表示的是 被包含的文件 的目录和文件名. 比如: a.php中 require/include( 包含)b.php文件, 则 在 b.php文件中 引用的 __DIR__和 __FILE__
表示的是b.php这个文件所在的目录 和 b.php这个文件 本身 的全路径文件名.
要注意, 应用目录名称后面一定要 加 斜杠, 即使是在www 目录下, 否则的话, 创建目录时, 会在该名称的后面分别加上相应的后缀,比如在定义APP_PATH时, 使用 define('APP_PATH', './My' );
则生成的目录将是: MyCommon, MyHOme, MyRuntime等...
tp中的 dump函数? 同 var_dump一样, dump 也只要是用来 输出 "倾倒出 " 调试信息用的. 而且 还可以给 调试信息加上 适当的 修饰 html标签...
- var_dump是 php自带的函数, 是 直接输出元素的 详细类型
- 而dump是 tp 在functions 中定义的函数, 是 "倾倒出" 的意思, 他有几个参数来控制他 "倾倒"的 行为:
\(echo=true, 控制是否直接输出到浏览器, 还是 将 "倾倒内容" 重导到 一个变量中; \)label是一个标签, 表示 给 倾倒内容 加上一个 html的 语义 标签, 比如<strong> <font color="red">...
这个标签 是要加在 \(output的前面的, 通常 是指给调试信息 一些 html标签颜色的... \)strict ? 是否严格? 是指输出的内容 加上 html标签 时, 是否需要严格的 /严谨的 html语法 要求. 比如 标签要正确地 关闭...
**要注意, 如果要 给 dump 错误信息 加上 $label标签的话, 应该将 $strict 设置为 false, 即不要 严格的 html语法规定, 才会有效 **
**preg_replace正则替换中 , 正则表达式中的 /m 表示 : ** http://www.cnblogs.com/shunyao8210/archive/2008/11/13/1332591.html
if (!$strict) {
if (ini_get('html_errors')) {
$output = print_r($var, true);
$output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
} else {
$output = $label . print_r($var, true);
}
/// 这个要注意了 : 默认的 print_r和 dump是 直接输出, 但是 可以 规定他们的 第二个参数位false 来改变 "不让输出" 而是 返回一个字符串.
========================================================================
$_SERVER中包含很多信息, 比如 客户端的信息, 使用HTTP_开头的元素名称, 比如 HTTP_HOST, HTTP_USER_AGENT, HTTP_COOKIE等等. 还有服务器端的信息, 如 SERVER_NAME等.其中, 几个服务器变量的元素含义: http://weizhifeng.net/difference-between-php_self-script_name-script_filename-path_info-and-request_uri.html
$_SERVER['script_filename']
$_SERVER['script_name']
$_SERVER['php_self']
$_SERVER['querying_uri']
### 为什么即使设置了 'URL_MODEL' =>2 仍然不能实现地址重写? 1. 首先, 虽然地址重写, 有利于 seo和 隐藏开发语言, 但是 如果没有特别需要, 还是 不建议使用 地址重写, 因为地址重写会引起性能下降, apachee会去查找当前目录以及所有的 上级目录中的 .htaccess文件, 而且是对每一次请求都会去查找; 而是 这种 (目录分布式)的配置 ,会降低服务器的安全. 1. 但是, 如果要实现这样的目的, 需要做的工作包括: 开启apache的rewrite_module modules/mode_rewrite.so 模块; 设置tp的 URL_MODEL为2; 在 DocumentRoot下创建 .htacess文件和重写内容. 1. 最需要警惕的是, 原来的httpd.conf一般来说, 对重写Override 控制得都比较严格, 几乎完全禁用了 全部目录的 Override None, 当然也对 /var/www/html目录设置了 Override None. 所以 这里的开关关闭后, 你的 重写自然不能生效了. 所以 , 你必须要开启 document root /var/www/html目录下的 Override为all, 然后 重启 httpd服务, 就能实现 省略index.php而实现地址重写了.
对文件的访问限制是依次放松的,但是对 .htaccess重写重载都是完全 禁用的.
<Directory /> / 根目录
Override None
require all denied
</Directory>
Relax access to content within /var/www
<Directory /var/www>
Override None
require all granted
</Directory>
Further Relax access to content within the default document root: /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
Override None
Require all granted
</Directory>