读《PHP和MySQL Web开发》笔记合集:
http://my.oschina.net/bluefly/blog/478580
1、
代码重用的好处
成本、可靠性、一致性
注意:只要原来的代码是模块化的而且编写良好,那么重复使用代码还会节省很多工作。在工作时,可以试着辨认一下今后可能再次要调用的代码段。
2、
require() 与被包含代码执行问题
如果希望一个被包含文件中的PHP代码能够被当成PH代码进行处理,必须将PHP代码放到PHP标记之间(不管被包含代码的文件是什么后缀,jpg、rar后缀都无所谓,只要里边的php代码是放在php标签里的,被包含后都能执行)
但是文件后缀,会影响浏览器访问该文件时是否直接载入,并以普通文本的形式查看源代码。
所以,
为了安全,请将被包含文件保存在文档树之外,或者使用标准的文件扩展名
例子:
3、如果
被包含文件不存在的话, require会给一个致命错误,而include 只会给一个警告。
还有两个变体,
require_once() ,include_once() 确保一个被包含的文件,只能被引入一次。
注意:当引入函数库时,这两个函数才非常有用,使用这两个函数可以防止错误的引入同样的函数库两次,从而出现重复定义的错误。如果关心编码实践,可以考虑使用require() 和include() ,因为它们的运行速度较快。
通过require() 调用外部文件的时候,文件的名称并不会影响对它们的处理
4、即使php后缀的,文件,如果写HTML代码,直接访问,还是当做html被解析处理的
注意:
如果
希望保证一个文件被当做纯文本或HTML,而且不会执行任何PHP
,可以使用
readfile()
作为替代方法。这个函数将回显文件内容,不会对其进行解析。如果使用的是用户提供的文本,这可能就是一个重要的安全问题。
5、一个好的静态页面模板
例子:
<html>
<head>
<style>
...
</style>
</head>
<body>
<!-- page header -->
...
<!-- menu -->
...
<!-- page content-->
....
<!-- page footer-->
...
</body>
</html>
6、希望将页眉和脚注加入到每个页面中
1)配置
php.ini
auto_prepend_file
auto_append_file
windows例子如下:
auto_prepend_file = “c:/Program Files/Apache Software Froundation/Apache2.2/include/header.php”
auto_append_file = “c:/Program Files/Apache Froup/Apache2/include/footer.php”
UNIX例子如下:
auto_prepend_file = “/home/username/include/header.php”
auto_append_file
= “/home/username/include/footer.php”
注意:如果使用了这些指令,就不需要再输入include() 语句,但页眉和页脚在页面中不再是页面的可选内容了
2)Apache Web下,
每个目录配置
.htaccess
这个文件需要包含如下两行代码:
php_value auto_prepend_file = “/home/username/include/header.php”
php_value
auto_append_file
= “/home/username/include/footer.php”
注意:其语法与php.ini中有所不同,没有等号,但很多php.ini中的设定也可以按照这种方法修改。
注意:在.htaccess 中设置选项,有极大的灵活性。可以在一台只影响你的目录的共享主机上进行,不需要重启服务器,也不需要管理员全下。
缺点是,使用.htaccess 的目录中每个被读取和被解析的文件每次都要进行处理,而不是只在启用时处理一次。
7、函数中可选参数的问题
首先注意,PHP里函数名不区分大小写,变量名区分,而JavaScript是都区分。
比如一个函数原型:
resource fopen( string
filename, string
mode [, bool
use_include_path [, resource
content]] )
详细解释:
"resource" 告诉我们该函数会返回一个资源,fopen()函数中,函数原型中共给出了4个参数。[] 刚括号指明了这个参数是可选的,可以忽略它们,如果忽略它们,它们会使用默认只。
请注意:一个具有多个可选值的函数,必须给可选参数从左到右赋值。比如,可以不给出 content 参数,或者可以不提供use_include_path 和 content 参数,但是不能不提供use_include_path ,而只给出content参数。
测试:
例子2:注意了哈,还有一个说法是,说php只传递值。
16依次赋给了第3个参数c。
8、调用未定义的函数
Fatal error: Call to undefined function tests1() in D:\wamp\www\study\fuc.php on line 10
注意:通常PHP给出的错误信息是非常有用的,它告诉我们错误出现在哪个文件中,哪一行,以及我们调用的函数名称。
如果看到这个信息,有3个可能:
1)函数名称的拼写是否正确;
2)这个函数是否存在于所有的PHP版本中;
3)所调用的函数是否是PHP扩展的一部分,而该部分并没有被载入。
9、函数的基本结构
1)函数命名有如下几个限制
函数名称不能喝已有函数重名(许多语言允许重复使用函数名称,叫“重载”,PHP不支持函数重载);
函数名称只能包含字母、数字和下划线且不能以数字开始。
注意:
$name 并不是一个函数的合法名称,但类似于$name(); 的函数调用,也可以正确地执行
,这是根据$name 的值来确定的。PHP可以取出保存在$name 中的值,寻找具有那个名称的函数,并且调用该函数。这种函数类型被称为
可变函数,而且有时候是有用的。
2)在{} 花括号中,可以包含在PHP 脚本的其他地方都合法的代码,其中包括函数调用、新的变量或函数声明、require()或include() 语句类声明以及HTML代码。
如果希望在一个函数中退出PHP 并输入 HTML脚本,可以像在脚本其他地方做的那样,使用一个风的PHP标记,然后再编写HTML。例子:
<?php
function my_function() {
?>
My function was called
<?php
}
?>
10、
3个帮助器函数,确定传递进来的参数情况
func_num_args():返回传入的参数个数
func_get_arg():一次获得一个参数
func_get_args():返回参数的数组
11、理解作用域
1)函数内局部变量和函数外全局变量,可以变量名相同,不冲突,懂。
2)有所谓的“超级全局变量”
3)global 可手动指定函数中的变量具有全局作用域。
4)调用 unset($variable_name) 可以手动删除变量,如果变量被删除,它就不再参数所指定的作用域中了。
例子:
因为$var 并没有被赋值。
建议:避免函数内外使用同一个变量名。
12、参数的引用传递和值传递
值传递:
function increment(
$value, $amount = 1)
{...}
引用传递:
function increment(&
$value, $amount = 1)
{...}
引用传递,能改变原值。
13、return
当一个函数的执行结束时,要么是因为所有命令都执行完了,要么就是使用了“return”,return可以不返回值,但是建议返回。
14、递归
PHP支持递归函数,递归函数就是函数调用自己本身。这些函数特别适用于浏览动态数据结构,例如连接列表和树。
但是,几乎没有基于Web的应用程序要求使用如此负责的数据结构。在很多情况下,递归可以用来取代循环,因为二者都是重复做一些事情。递归函数比循环慢而且要占用更多内存,所以应该尽可能多用些循环。
<?php function reverse_r($str) { if (strlen($str)>0) reverse_r(substr($str, 1)); echo substr($str, 0, 1); return; } function reverse_i($str) { for ($i=1; $i<=strlen($str); $i++) { echo substr($str, -$i, 1); } return; } reverse_r(‘Hello‘); echo ‘<br />‘; reverse_i(‘Hello‘); ?> |
但是,如上边的例子,递归那段,每次调用这个函数都在服务器的内存中生成一段该函数代码的新副本,递归函数将在内存中创建几个自身的副本,而且将产生多次函数调用的开销。
虽然递归看上去更美观,但一定要给出终止条件,否则将导致服务器内存耗尽,或者达到了最大调用次数。
15、命名空间
(又叫名称空间,namespace)
通常,命名空间是一个抽象的容器,它可以包含一组标识符;
PHP中,命名空间可以包含你所定义的函数、常量和类。
从结构角度看,为自定义函数和类定义命名空间的有点:
1)一个命名空间中的所有函数、类和常量都将冠以名称空间前缀。
2)非全路径的类、函数和常量名称将在运行时解析,在查看全局空间之前,将首先查看命名空间。