PHP语法容易忽略的地方
1.PHP变量区分大小写,定义的函数、类名以及系统内置的函数和关键字不区分大写。
2.PHP结束标记“?>”前的那条语句的分号可省略,但不推荐。
3.注释:
<? echo $a; #print $a ?><h1>something</h1>
遇到php结束符号则#注释自动终结
类似的:/*注释也是遇到php结束符号则注释自动终结
上面的语法合法,但不推荐使用。
/*ddddddd /*ffffff */ dddd */
这样的注释嵌套导致出错,因为PHP视图执行“ffffff”。
4.类名stdClass被保留
5.define函数定义常量,常量引用时不加$
6.函数名和关键字不区分大小写
7.浮点数的值仅仅是书的近似表示,尽量避免假定浮点数是完全精确的,利用“==”比较浮点数时,通常将其启动若干为小数位置后比较。
if( int($a * 1000) == int($b * 1000)).....//后移三位小数点并转换为整形后比较
8. $path='c:\\windows';echo $path;打印:"c:\\windows"
9.资源(或称为句柄)实际上是整数,使用资源的好处是它会自动完成内存的管理,但最后一个对资源的引用销毁时,常见该资源的扩展被调用来为该资源释放所有内存,关闭所有连接等。函数中容易发现自动清空资源的好书,将资源指派给一个局部变量,当函数调用结束时,变量的值自动被php回收。例如:
function func1(){
$res = database_connect();database_query($res);
//退出函数时连接自动关闭
}
尽管可用上面的方法,还是推荐显示的销毁资源。
10.可变变量(即变量的变量)
$foo = 'abc';
$$foo = 'xyz';//$abc的值 "xyz"
11.php中的变量引用:就是如何创建变量的别名。(用C中的指针理解要容易些)
$a = & $b; //$a和$b正向相同的内存区域。其一改变另一也改变,销毁其一不影响另一。
函数利用引用可以传递参数(避免赋值大的字符串或数组)。例如:
function &ret_ref(){
$var="php";//$var是大树组或者的字符串时效率比较高
return $var;
}
$v = & ret_ref();
12.php中的局部变量只存在与函数中,循环、分支和块中的变量不是局部变量。函数为定义的变量为全局变量,函数内要访问全局变量必须声明为global,然后再使用(也可以使用笨方法,就是全局数组$GLOBALS)。
13.php使用“引用计数”和“写时复制”技术。
14.
15.返单引号`string`中的字符串被当作shell命令执行。例如:
$str = `ls -l root`;
echo $str;
16. break N;
while(...){
......
while(){
....
break 2;//退出2层While循环
}
......
}
continue N;用法类似
17.require,include的主要区别
require一个不存在的文件导致致命错误,停止继续往下执行;include则产生一个警告,继续往下执行。include指令通常用于将一个页面中的特定部分分离出来(如header,footer之类的。。。)。require通常用在加载库文件,如果库文件不存在则程序无法运行。
18.allow_url_fopen
如果允许php.ini中此选项的话 ,可以类似:include “http://blog.opendigest.org/abc.inc”;
19.require_once,include_once指令防止一个文件包含多次。
20.get_included_files(),或者文件中包含(include或者require)了多少文件的绝对路径列表。
21.
22.函数参数操作相关的函数:
func_get_arg — Return an item from the argument list
func_get_args — Returns an array comprising a function's argument list
func_num_args — Returns the number of arguments passed to the function
23.匿名函数
create_function — Create an anonymous (lambda-style) function
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>
24.PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
25.可用变量来提供类名
例如:
$a = "class1";
$b = new $a;
$account = new Account;
$object = 'account';
${$object}->method1();
26.对象变量之间是引用赋值的,要复制完整的对象必须使用clone操作符。
克隆对象时,如果被克隆的对象内部含有“__clone”方法时,此方法在执行克隆操作时自动被执行。
27.类名stdClass为保留类名。$this变量表示当前对象的引用。方法前用final修饰时,此方法不能被子类覆盖。
28.public ,private(当前类可访问),protected(当前类和子类可访问)
29.静态属性,和静态方法的访问方法:类名::属性或者方法;
如果要在类的实例中访问静态属性使用self关键字:self::属性名;
30.如果访问类中未定义的属性,当此类中定义的有“__get()”和"__set()"方法时,这两个方法优先为获取属性值或者设置属性的值。
- <?php
- //定义学生类
- class Student {
- function __get($property) {
- if ($property == "name") {
- $name = "zhangsan";//这里是直接赋值,更常用的是从数据库中检索出数据。
- return $name;
- }
- }
- function __set($property, $value) {
- if ($property == "sex") {
- $sex = $value;
- //其他操作,例如修改数据库中的数据。
- }
- }
- }
- $myStudent = new Student ();
- $p = "name"; //定义需要访问的学生类中的未定义属性:name
- echo $myStudent->$p; //访问学生类中未定义的属性name,打印结果为:zhangsan
- $p = "sex";
- $myStudent->$p = "man"; //访问学生类中未定义的属性name。由于学生类中已经定义了方法__set,则 此方法会被调用,为name属性赋值
- ?>
31.用const定义类常量,类常量不需要实例化即可访问。
32.显式的访问父类中的方法使用 parent::method() 其中parent为关键字,不能用父类的类名代替。
33.使用self::method(),明确的指出访问当前类定义的方法。
34.instanceof操作符用来检查一个对象是否是一个类或接口的实例。
35.php中的构造函数,默认为__construct(),如果没有时,会找与类名同名的构造函数。
<?php
//此代码测试php中的构造函数:__construct() 优先与 类名();
class Test {
var $name ;
function __construct($name){
echo "in __construct() !";
$this->name = $name;
}
function Test($name){
echo "in Test()!";
$this->name = $name;
}
}
$test = new Test("zhangsan"); //打印 "in __consturct()",如果注释方法__construct,则打印"in Test()!"
?>
php中的构造函数不会自动调用父类中的构造函数(如果要调用需要显示的调用)。
<?php
class ParentClass{
var $name;
function ParentClass($name){
$this->name = $name;
}
}
class SubClass extends ParentClass{
var $sex;
function SubClass($sex){
$this->ParentClass("zhangsan");
$this->sex = $sex;
}
}
$subClass = new SubClass("man");
echo $subClass->name; //输出:zhangsan
?>
36.php中的析构函数为:__destruct(),php会自动回收资源,故析构函数作用有限。
37.php中的对象序列化(或者称为串行化):将一个对象转换成字节流形式,这样可将对象保存在文件中。对于数据的持久化很有用(例如session的自动保
存与恢复)。php中只需要调用serialize()和unserialize()这两个函数即可完成对象序列化(注意session的序列化是自动完成的,不需要调用这两个函
数,如果自己进行序列化时则需要调用这两个函数。)。串行化通常用于PHP中的session中。
<?php
class Test {
var $name ;
function __construct($name){
echo "in __construct() !<br>";
$this->name = $name;
}
function Test($name){
echo "in Test()!<br>";
$this->name = $name;
}
}
$test = new Test("zhangsan"); //打印 "in __consturct()",如果注释方法__construct,则打印"in Test()!"
$ttt = serialize($test);//串行化,通常将其保存在文件中。
$myTest = unserialize($ttt);//反串行化
var_dump($myTest);
?>
38. __sleep()方法在对象被串行化前调用,用于进行一些清理工作(如关闭数据库连接)。该方法返回以数组,其中包含那些需要被写入字节流的数据成员
的名称,如果返回空数组,则没有任何数据被写入字节流。
<?php
class Test2{
var $name,$sex;
function Test2($name,$sex){
$this->name = $name;
$this->sex = $sex;
}
function __sleep(){
//执行数据库关闭或者保存数据之类的操作
//return array("name","sex");
return array("sex"); //序列化时只保存sex的数据,name的数据 为null。
}
}
$myTest = new Test2("zhangsan","man");
$temp = serialize($myTest);
$newTest = unserialize($temp);
var_dump($newTest);
?>
40. __warkup()方法则在对象被反序列化时(即对象从字节流中被创建时被立即调用),它执行一些必要的操作(如数据库连接,其他初始化之类的操作)。
41. PHP会自动创建6个全军数组:EGPCS(environment,GET,POST,cookie,server) $_ENV,$_GET,$_POST,$_FILES,$_COOKIE,$_SERVER,这些数组不但是
全局数组,而且在函数定义中也可以见(自定义的全局变量在函数中引用时要用global声明),故又称为超全局数组。
42. PHP中上传文件大小的限制:在php.ini中设置upload_max_filesize的为硬性限制,如果在表单中上传的变量中含有“MAX_FILE_SIZE”(<input
type="hidden" name="MAX_FILE_SIZE" value="10240">)(单位为字节),则php将使用此变量的值作为文件大小的软限制。
43. PHP中session id被保存在一个名为PHPSESSID的cookie中,如果浏览器禁用cookie,则session id 会被传递到web站点的URL内。经测试,禁用浏览器的
cookie时,无法登录网易邮箱,服务器脚本要做适当的处理才可以。或者在编译php时激活“-enable-trans-id”选项,这样php可以重写html文件,为每
个相对连接加上session id,但会带来性能问题,顾大型站点都倾向于使用cookie保存session id。
44. PHP中session默认使用file方式保存,当多个站点在同一个服务器上时,会带来安全问题,另外,如果需要在多个站点间使用同一个session将无法实现
,将session保存在数据库中可以解决这两个问题。
45. 函数ini_set()可以动态的修改php.ini中的配置。也可以在apache配置文件中对某些目录或者虚拟主机设置,而不修改php.ini文件。



