PHP语法容易忽略的问题小结
星期四, 2012-11-01 | Author: Lee | linux, php | 6,704 views
之前收藏的一个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 “//www.pomelolee.com/test.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”()(单位为字节),则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文件。
文章作者: Lee
本文地址: https://www.pomelolee.com/1030.html
除非注明,Pomelo Lee文章均为原创,转载请以链接形式标明本文地址
No comments yet.
Leave a comment
Search
相关文章
热门文章
最新文章
文章分类
- ajax (10)
- algorithm-learn (3)
- Android (6)
- as (3)
- computer (85)
- Database (30)
- disucz (4)
- enterprise (1)
- erlang (2)
- flash (5)
- golang (3)
- html5 (18)
- ios (4)
- JAVA-and-J2EE (186)
- linux (143)
- mac (10)
- movie-music (11)
- pagemaker (36)
- php (50)
- spring-boot (2)
- Synology群晖 (2)
- Uncategorized (6)
- unity (1)
- webgame (15)
- wordpress (33)
- work-other (2)
- 低代码 (1)
- 体味生活 (40)
- 前端 (21)
- 大数据 (8)
- 游戏开发 (9)
- 爱上海 (19)
- 读书 (4)
- 软件 (3)