PHP语法容易忽略的问题小结

星期四, 2012-11-01 | Author: Lee | linux, php | 6,598 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_argReturn 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文件。

Tags: ,

文章作者: Lee

本文地址: https://www.pomelolee.com/1030.html

除非注明,Pomelo Lee文章均为原创,转载请以链接形式标明本文地址

No comments yet.

Leave a comment

Search

文章分类

Links

Meta