人的头脑太复杂,时间过得久,有时候连自己也被自己骗了,记下来才是最真实的......开源技术博客,记录开源技术应用的点点滴滴。 注册 | 登陆

PHP语法容易忽略的地方

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使用“引用计数”和“写时复制”技术。

大小: 259.25 K
尺寸: 500 x 400
浏览: 3 次
点击打开新窗口浏览全图

大小: 112.4 K
尺寸: 500 x 173
浏览: 2 次
点击打开新窗口浏览全图

14.

大小: 112.05 K
尺寸: 500 x 271
浏览: 0 次
点击打开新窗口浏览全图

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.

大小: 123.29 K
尺寸: 500 x 186
浏览: 2 次
点击打开新窗口浏览全图

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_functionCreate 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代码
  1. <?php
  2. //定义学生类
  3. class Student {
  4. function __get($property) {
  5. if ($property == "name") {
  6. $name = "zhangsan";//这里是直接赋值,更常用的是从数据库中检索出数据。
  7. return $name;
  8. }
  9. }
  10. function __set($property, $value) {
  11. if ($property == "sex") {
  12. $sex = $value;
  13. //其他操作,例如修改数据库中的数据。
  14. }
  15. }
  16. }
  17. $myStudent = new Student ();
  18. $p = "name"; //定义需要访问的学生类中的未定义属性:name
  19. echo $myStudent->$p; //访问学生类中未定义的属性name,打印结果为:zhangsan
  20. $p = "sex";
  21. $myStudent->$p = "man"; //访问学生类中未定义的属性name。由于学生类中已经定义了方法__set,则 此方法会被调用,为name属性赋值
  22.  
  23. ?>

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文件。

« 上一篇 | 下一篇 »

Trackbacks

点击获得Trackback地址,Encode: UTF-8

发表评论

评论内容 (必填):