Maison > Article > développement back-end > PHP学习笔记5:代码重用和函数
读《PHP和MySQL Web开发》笔记合集:
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、一个好的静态页面模板
例子:
...
...
...
....
...
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。例子:
function my_function() {
?>
My function was called
}
?>
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的应用程序要求使用如此负责的数据结构。在很多情况下,递归可以用来取代循环,因为二者都是重复做一些事情。递归函数比循环慢而且要占用更多内存,所以应该尽可能多用些循环。
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 { echo substr($str, -$i, 1); } return; } reverse_r('Hello'); echo ' reverse_i('Hello'); ?> |
虽然递归看上去更美观,但一定要给出终止条件,否则将导致服务器内存耗尽,或者达到了最大调用次数。
15、命名空间 (又叫名称空间,namespace)
通常,命名空间是一个抽象的容器,它可以包含一组标识符;
PHP中,命名空间可以包含你所定义的函数、常量和类。
从结构角度看,为自定义函数和类定义命名空间的有点:
1)一个命名空间中的所有函数、类和常量都将冠以名称空间前缀。
2)非全路径的类、函数和常量名称将在运行时解析,在查看全局空间之前,将首先查看命名空间。