《PHP学习笔记》
1.PHP 会在输出时自动删除其结束符 ?> 后的一个换行。
2.同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。一段 PHP 代码中的结束标记隐含表示了一个分号;在一个 PHP 代码段中的最后一行可以不用分号结束。如果后面还有新行,则代码段的结束标记包含了换行符(注:会吃掉后面的换行符)。 如果你想保持换行符在一个关闭标签后,仅仅在关闭标签之后加一个空格就可以了.
如:----------------------------------------------
<?php
echo "This is a test";
?>
<?php echo "This is a test" ?>
<?php echo 'We omitted the last closing tag';
------------------------------------------------
3.文件末尾的 PHP 代码段结束标记可以不要,有些情况下当使用 include() 或者 require() 时省略掉会更好些,这样不期望的白空格就不会出现在文件末尾,之后仍然可以输出响应标头。在使用输出缓冲时也很便利,就不会看到由包含文件生成的不期望的白空格。
4.单行注释仅仅注释到行末或者当前的 PHP 代码块,视乎哪个首先出现。这意味着在 // ... ?> 或者 # ... ?> 之后的 HTML 代码将被显示出来:?> 跳出了 PHP 模式并返回了 HTML 模式,// 或 # 并不能影响到这一点。如果启用了 asp_tags 配置选项,其行为和 // %> 或 # %> 相同。不过,</script> 标记在单行注释中不会跳出 PHP 模式。
5.要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都不区分大小写。
6.八进制表示数字前必须加上 0(零),十六进制表示数字前必须加上 0x。 二进制表示数字前必须加上 0b(since php5.4)。
7.如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。
8.FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。
9.决不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。
10.永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。
11.字符串最大长度是2GB.
12.Heredocs结构不能用来初始化class属性,而从PHP 5.3以后,则该限制只能用在包含变量的情况下。
13.在heredoc结构中字符串表达复杂变量时,要格外小心。
14. 在 声明变量时要按一定的规则,比如变量名是严格区分大小写的。但内置结构和关键字以及用户自定义的类名和函数名都是不区分大小写的。
15.php可以用花括号来明确变量名的界线。
16.函数、方法调用、类的静态变量和类的常量只有在PHP 5以后才可在 {$} 中使用。然而,访问的值将被解释为在其中定义该字符串的范围中的变量的名称。只单一使用花括号 ({}) 不能用于访问函数或方法的返回值或类的常量或静态类变量的值。
17.自 PHP 4.3.0 起,数组索引生成方法改变了。如今如果给一个当前最大键名是负值的数组添加一个新值,则新生成的的索引将为零(0)。以前新生成的索引为当前最大索引加一,和正值的索引相同。
18.数组中,使用 TRUE 作为键名将使 integer 1 成为键名。使用 FALSE 作为键名将使 integer 0 成为键名。使用 NULL 作为键名将等同于使用空字符串
19.PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。(会产生一个notice警告)
20在双引号字符串中,不给索引加上引号是合法的因此 "$foo[bar]"是合法的.
21NULL 类型只有一个值,就是大小写不敏感的关键字 NULL(你可以写成NULL,也可以写成null)。
22静态变量 在声明中用表达式的结果对其赋值会导致解析错误。
23在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。变量$this 也是一个特殊的变量,该变量不能被动态引用。
24应该注意到点(句号)不是 PHP 变量名中的合法字符。要注意 PHP 将会自动将传入的变量名中的点替换成下划线。
25常量默认为大小写敏感。通常常量标识符总是大写的。
26和 superglobals 一样,常量的范围是全局的。
27魔术常量不区分大小写.
28取模运算符(%)的操作数在运算之前都会转换成整数(除去小数部分)。
29如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。
30三元运算:表达式 (expr1) ? (expr2) : (expr3) 在 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。
31@ 运算符只对表达式有效。对新手来说一个简单的规则就是:如果能从某处得到值,就能在它前面加上 @ 运算符。例如,可以把它放在变量,函数和 include() 调用,常量,等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。
32使用反引号运算符“`”的效果与函数 shell_exec() 相同。反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。
33递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。
34 + 运算符把右边的数组元素(除去键名与左边的数组元素相同的那些元素)附加到左边的数组后面,但是重复的键 名的值不会被覆盖。
35 elseif 与 else if 只有在使用大括号的情况下才认为是完全相同 .
36 PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
37除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。foreach对数组指针有些副作用。除非对其重置,在 foreach 循环中或循环后都不要依赖数组指针的值。
37.5 因为 foreach 依赖内部数组指针,在循环内对其进行更改可能会导致意外的行为.
38自 PHP 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的元素。
39引用一个值,最后一个数组元素被保留 甚至在foreach循环后,建议用unset()销毁它.
40foreach 不支持用“@”来抑制错误信息的能力。
41省略 continue 后面的分号会导致混淆.
42注意 switch/case 是 (松散比较)
43理解 switch 是怎样执行的非常重要。switch 语句一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个 case 语句中的值和 switch 表达式的值匹配时 PHP 才开始执行语句,直到 switch 的程序段结束或者遇到第一个 break 语句为止。如果不在 case 的语句段最后写上 break 的话,PHP 将继续执行下一个 case 中的语句段。
44允许使用分号(;)代替case语句后的冒号(:).
45declare 结构也可用于全局范围,影响到其后的所有代码(但如果有 declare 结构的文件被其它文件包含,它对包含它的文件不起作用)。
46如果在一个函数中调用 return() 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。return() 也会终止 eval() 语句或者脚本文件的执行。
如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被 include() 的或者 require() 的,则控制交回调用文件。此外,如果当前脚本是被 include() 的,则 return() 的值会被当作 include() 调用的返回值。如果在主脚本文件中调用 return(),则脚本中止运行。如果当前脚本文件是在 php.ini 中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行。
47注意既然 return() 是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。
48 return当用引用返回值时永远不要使用括号,这样行不通。
50PHP 中的所有函数和类都具有全局作用域,可以在函数内部定义函数外部调用,反之亦然。
51函数名是大小写无关的,不过在调用函数的时候,通常使用其在定义时相同的形式。
52在 PHP 中可以调用递归函数。但是要避免递归函数/方法调用超过 100-200 层,因为可能会破坏堆栈从而使当前脚本终止。
53函数参数默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等表达式。PHP还允许数组和NULL作为默认参数。
54函数参数请注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。
55从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & .
56匿名函数目前是通过 Closure类来实现的。
57PHP当中对象是按引用传递的,即每个包含对象的变量都持有对象的引用(reference),而不是整个对象的拷贝。
58在类中,如果直接使用var声明属性,而没有public, protected, 或 private,php 5 会认为这个属性为public。
59在类的方法里面,可以通过$this->property(property是属性名字)这种方式来访问类的属性、 常量($this::常量)、方法, 但是要访问类的静态属性、或者在静态方法里面却不能使用,而是使用self::$property。
60在类的非静态方法里面可以使用伪变量$this。 这个伪变量是调用该方法的实例化对象引用(一般来说该对象是这个方法所在类的实例化对象, 但是也有可能是另外的类的对象,比如在另一个类里面使用静态化来调用这个类的方法 )。
61在php 5.3.0 增加了Nowdoc的支持。
62不像 heredocs, nowdocs 可以在任何静态数据上下文中使用 , 包括属性声明.
63PHP5.3.0之后,我们可以用一个变量来动态调用类。但该变量的值不能为关键字(如self, parent 或static).
65如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。
66自PHP 5.3.3起, 在命名空间中,与类名同名的方法不再作为构造函数。 这一改变不影响 不在命名空间中的类。
67和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。
68对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问; 由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
69当一个子类覆盖其父类中的方法时,PHP 不会再执行父类中已被覆盖的方法. 直到子类中调用这些方法为止。 这种机制也适用于 构造函数和析构函数, 重载, 及 魔术 方法定义。
70继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;另外,这些方法的 可见性 必须和抽象类中一样(或者更为宽松)。例如,如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不能定义为private。 此外方法的签名必须匹配, 也就是类型约束和所需的参数的数目必须相同。 这也适用于 PHP 5.4 起的构造函数。 在 5.4 以前,构造函数签名可能有所不同.
71接口中定义的所有方法都必须是public,这是接口的特性。
72要实现一个接口,可以使用implements操作符. 类中必须实现接口中定义的所有方法,否则会报一个fatal错误。类可以实现多个接口,可以用逗号来分隔多个接口的名称。
73实现多个接口时,接口中的方法不能有重名。因为它会引起混淆。 接口也可以继承,通过使用extends操作符.
74类型约束只支持对象 和 接口,数组(php 5.1之后),callable (自php5.4). 4种类型。而不支持整型 和 字符串类型 。 注意,即使使用了类型约束,如果使用NULL作为参数的默认值,那么在调用函数的时候依然可以使用NULL作为实参。
75session_register()这个函数在php5.3.0已经废弃,而且在php5.4.0就不再支持,所以不要依赖这个函数。
76虽然任意合法的PHP代码都可以包含在命名空间中,但只有四种类型的代码受命名空间的影响,它们是:类,接口,函数和常量。
77如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,但有一个例外:declare关键字 。
78在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前 。
79与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。
80注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。
81PHP 命名空间支持 有三种使用别名或导入方式:为类名称使用别名,为接口名称使用别名或为命名空间名称使用别名。注意PHP不支持导入函数或常量。
82namespace\Foo 也是一个完全限定名称。
83PHP 内部函数主要使用错误报告, 只有现代面向对象的扩展才使用异常。
84如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
85$php_errormsg 变量包含由 PHP 生成的最新错误信息。这个变量只在错误发生的作用域内可用,并且要求 track_errors 配置项是开启的(默认是关闭的)。
86永远不要使用超级用户或所有者帐号去连接数据库。要用权限被严格限制的帐号。
87用 PHP 进行 HTTP 认证,在编写 HTTP 标头代码时请格外小心。为了对所有的客户端保证兼容性,关键字“Basic”的第一个字母必须大写为“B”,分界字符串必须用双引号(不是单引号)引用;并且在标头行 HTTP/1.0 401 中,在 401 前必须有且仅有一个空格。
88文件上传MAX_FILE_SIZE 隐藏字段(单位为字节)必须放在文件输入字段之前,其值为接收文件的最大尺寸。
89max_execution_time 仅仅只影响脚本本身运行的时间。任何其它花费在脚本运行之外的时间,诸如用函数 system() 对系统的调用、sleep() 函数的使用、数据库查询、文件上传等,在计算脚本运行的最大时间时都不包括在内。
90当连接请求很频繁时,永久连接将显著的提高效率。
91在使用永久连接时还有一些特别的问题需要注意。例如在永久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被永久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用永久连接,这可以从根本上解决这个问题(当然还可以在其它地方使用永久连接)。
92在函数调用时通过引用传递参数是不推荐的,因为它影响到了代码的整洁(已废弃从php5.4)。
93 EGPCS(Environment,GET,POST,Cookie,Server)变量解析的顺序。默认设定为“EGPCS”。
94输出控制函数不影响由 header() 或 setcookie()发送的文件头信息,仅影响象 echo()这样的函数和PHP代码块间的数据。
95当同时加载mysql扩展库和 recode 扩展库时 PHP 可能会崩溃。更多信息见 recode 扩展库。
96如果你是使用MySQL4.1.3或更新的服务端版本,强烈建议你使用mysqli 扩展替代它
97mysql,mysqli以及PDO Mysql驱动都可以各自配置使用 libmysql或者mysqlnd。mysqlnd作为一个专门设计 用于PHP系统的库,它在内存和速度上都比libmysql有很大提升。非常希望你去尝试这些提升。
98PHP中三种主要的MySQL连接方式mysqli扩展建议首选.
99IMAP,recode,YAZ 和 Cyrus扩展不能同时使用,因为它们共享了相同 的内容符号。注意:Yaz 2.0 及以上版本不存在此问题。
100要在 Windows 下启用 exif,在 php.ini 中 php_mbstring.dll 必须在 php_exif.dll 之前加载。
101 ctype --- 应注意ctype函数总是优于正刚表达式,甚至一些等价于str_* and is_* 函数. 这是由于这样的事实:ctype使用本地C库因此处理有明显加快。
102大家转mysqli吧, 尤其是新入门PHP的同学, 不要再去学习mysql了. mysql马上要被deprecated了
103 从php 5.3起 丢弃 ISAPI 模块支持. 使用改进的 FastCGI SAPI 模块替代.
104 PHP 5.3.0 新增了两个错误等级: E_DEPRECATED 和 E_USER_DEPRECATED. 错误等级 E_DEPRECATED 被用来说明一个函数或者功能已经被弃用. E_USER_DEPRECATED 等级目的在于表明用户代码中的弃用功能, 类似于 E_USER_ERROR 和 E_USER_WARNING 等级.
105 现在PHP开发者在操作使用XML时,又多了一种选择—— SimpleXML,这是PHP5全新开发的外部扩展库,用以替代DOM或较难用的SAX.
106 逻辑运算符中的逻辑与“&&” 和逻辑或“||”存在短路的问题。位运算符中的按位与“&”和按位或“|”,作为逻辑判断时则不存在短路的问题。
107不仅在函数中声明的变量是局部变量,函数参数在函数名后面的括号内声明也是局部变量。
109 可变变量允许动态改变一个变量名称。
110 函数中返回值尽量用return,不用echo.
111 UTC通用协调时间=GMT(格林威治标准时间)。
112变量名称可以与一个函数名称相同,但最好不要这样。
113 常量名称都是由大写字母组成的。
114 引用常量时,它前面没有$符号。
115 常量只可以保存布尔值,整数,浮点数或字符串数据。
116赋值操作符(=)读作“被设置为”。
117执行操作符,是一对反引号(``),PHP将试着将反引号之间的命令当作服务器端的命令行来执行。
118 PHP中,elseif= else if(只在使用大括号时)。
119 函数调用不区分大小写。
120 sql语句不区分大小写,但数据库和表的名称区分大小写(linux).
121 列的名称和别名的名称不区分大小写,但是不能在同一个sql语句中使用不同的大小写(linux)(?)。
122 Mysql中,limit并不是ANSI SQL的一部分,它是Mysql的扩展。
123 MYSql支持许多不同的存储引擎,有时候也称为表格类型。
124 数据库每个表可以使用不同的存储引擎。而且可以对它们进行转换。
125 PHP上传文件,在脚本执行结束前,上传的临时文件将被删除。因此,如果要保留上传文件,必须将其重命名或移动。
126 删除抽象静态类方法。 由于疏忽, PHP 5.0.x和 5.1.x 在类中允许抽象静态方法. 从 PHP 5.2.x起, 仅接口可以拥有它们。
127如果一个文件是纯粹的PHP代码,省略PHP关闭标签在文件的末尾是较好的。
128 从 PHP 5.3.0起, PHP 支持 .htaccess风格 的基于每目录的INI 文件 . 这些文件仅被 CGI/FastCGI SAPI处理.
129 如果你保存你的代码为UTF-8, 确保 BOM (EF BB BF) 不是文件的前三个字符,否则可能会干扰了代码,如果PHP需要运行于任何输出前 (如header()).
130 一些服务器有个有关提交按钮名称的问题,并给出"Not Acceptable error" or Error 406.解决办法是提交按钮名称里不能包括下划线。
131 semaphores 和shared memory enables 能确保你的非线程安全的php模块也是线程安全的。
132 在redhat系列(Red Hat Enterprise, Fedora, CentOS),如果你想安装 MySQL, 它需要在php之前安装,因为php需要一些库.
133 在red hat 系列系统中,mysql和apache要在php之前先安装。
135 如果php用于iis,选用 PHP 5.3 VC9 Non Thread Safe 或者 PHP 5.2 VC6 Non Thread Safe。
136 当心 "0.00" and "0.0" 转换为布尔值TRUE.
137 var_dump(0 == 'all'); // TRUE, 小心 var_dump(0 === 'all'); // false ,var_dump((string)0 == 'all'); // false.
138 PHP非常挑剔对字符串转换为布尔值false。唯一承认是'0'或者'',其它任何的值都为TRUE,甚至'false'和'0.0'的值都为true!
140 当心赋值在if 语句, 例如: if($var = $arg),$var 可能被赋值 "1" 代替期望值在 $arg.>>
141 小心使用模操作符在一个大的数字,它将返回一个错误的结果。
142 强制正确使用32位的无符号整型在某些函数 ,仅仅加一个'+0' 在处理他们之前。如echo(dechex("2724838310"));是错的,echo(dechex("2724838310"+0));是对的。
143 别忘了整数的最小值. 从我的实验, 最低的有效整数是 (PHP_INT_MAX * -1)-1.
144 -2147483648 落入 32位有符号整数范围,但是php认为它是一个浮点数. 然而, -2147483647-1 被视为一个整数.
145 必须非常小心依靠整数溢出的代码,Negative overflow(负数溢出)不同平台不同处理方法.
146 一般说来,如果一个数有一个小数点(即为一个浮点数),使用BCMath函数。
147 浮点数一般在64.0以下是准的。
148 无论如何,——非常小心浮点数转换到字符串或再转回来。
149 当从浮点数转换成字符串时,尾随0将被删除。如30.00 变为30.
150 为了保险起见, 我们应该使用字符串来保存大整数, 并且采用比如bcmatch这样的数学函数库来进行计算。
151 在PHP 5.3.0以后,也可以用Heredoc结构来初始化静态变量和类的属性和常量。
152 当在字符串中使用多维数组时,一定要用花括号将它括起来.(最好一维数组也用花括号括起来)。
153 写入超出范围的偏移量 将用空格填充字符串。非整数类型被转换成整数,非法偏移类型会产生一个 E_NOTICE级别错误,负数偏移量在写入时会产生一个E_NOTICE,但读取的是空字符串。被指定的字符串只有第一个字符可用,空字符串分配为空字节。
154 一个值可以通过在其前面加上(string)或用strval()函数来转变成字符串。 在一个需要字符串的表达式中,字符串会自动转变,比如在使用函数 echo() 或 print() 时, 或在一个变量和一个 字符串 进行比较时,就会发生这种转变.
155 一个boolean TRUE 值被转换成 字符串"1"。 Boolean FALSE 被转换成"" (空的字符串)。 这种转变可以在 boolean 和 字符串 之间往返进行.
156 一个 整数 或 浮点数 被转变为数字的字面样式的字符串 (包括 浮点数中的指数部分),浮点数 使用指数计数法 (4.1E+6)也可转变。
157字符串转变成数字:如果字符串 没有包含 '.','e'或'E' 并且数字值符合整数类型的限定 ( PHP_INT_MAX定义的), 这个 字符串 可被认定是一个 integer, 在其它情况下被认定为一个float。
158 字符串的开始部分给定了它的值,如果 字符串 以合法的数字开始,这个数字可直接使用。 否则,值就是 0 (零)。 合法数值由符号,后面跟着一个或多个数字(可能有个小数点),再跟着可选的指数符号如'e' 或 'E',后面跟着一个或多个数字.
160 对于任何的类型:整型、浮点、字符串、布尔和资源,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为 0),该元素即为此标量的值。如果将一个对象转换成一个数组,所得到的数组的元素为该对象的属性(成员变量),其键名为成员变量名。
161 heredoc不能放到php文件的最后一行。(即没有?>结束符的情况下)
162 从PHP 5.4 起你也可以用短数组语法 ,用 []替代array().
163 数组类型转换:
有效数字型字符串作为键名将被转为整数. 如: 键名"8" 转为 8. 而"08"还是"08",因为它不是一个有效的十进制整数.
浮点数作为键名也转换为整数, 小数点以后将被删除。
布尔值作为键名也将转为整数true:1,false:0.
Null 作为键名将被转换为空"".
Arrays 和objects 不能作为 数组的keys.
164 如果多个元素在数组中使用相同的键名,只有最后一个将被使用所有其他的都被覆盖。
165 从 PHP 5.4开始, 字符串偏移(string offset )访问变为一致. 因此,一些返回值可能不同于老的版本。 在 PHP 5.4, string offset 字符串偏移应该为整数或整数类字符串, 否则将发出一个警告.
166 在php 5.4 可以直接地用函数或方法的返回结果的数组值(如getArray()[1])在这以前只有可能用一个临时变量。
167 应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。
168 这并不意味着总是给键名加上引号。用不着给键名为常量或变量的加上引号,否则会使 PHP 不能解析它们。
169 stdClass是一个php的基类。
170 如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会实例化一个内置类 stdClass 的对象。如果该值为 NULL,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为 scalar 的成员变量将包含该值。
171 转换一个变量到null用(unset)$var将不会删除这个变量或复位它的值。它将仅返回一个NULL值。
172 递增操作符 ("++") 不进行从布尔到整数的类型转换。
173 可以引用一个未定义的变量。
174静态变量可以用static声明。如果在声明中用表达式的结果对其赋值会导致解析错误。
175 要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。
176 类属性也可以使用可变的属性名访问. 可变属性名称 将被转变在被调用的范围内. 例如, 如果你有一个表达式 如 $foo->$bar, 那么局部作用域将被$bar检查并且它的值将被用于$foo属性的名称 . 这也是真的如果 $bar是一个数组存取.
177 点和空格在传入变量的名字里将被转换成下划线。
178 相对于用define()定义常量, 用const关键词定义常量 必须定义在顶级作用域 因为他们是定义在编译期. 这意味着它们不能定义在函数,循环或if语句里。
179 除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。 取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。
180 从PHP 5.3开始, 可以省去三元运算符的中间部分. 表达式 expr1 ?: expr3 返回 expr1 如果expr1 求值为TRUE, 否则返回 expr3.
182 continue 0; 和continue 1; 当运行continue时是一样的.
183 对于"return":如果没有附加参数, 那么圆括号必须被省略并返回NULL. 调用return用圆括号但是没有提供参数将导致一个解析错误.
184 spl_autoload_register()提供了一个更灵活的替代autoloading类。因为这个原因,使用__autoload() 是不赞成的并且可能在未来弃用或移除。
185 Visibility from other objects:同一类型的对象, 将获得彼此的 private 和 protected成员,即使他们是不一样的实例。
186 除非autoloading已使用,类必须在使用之前被定义。如果一个类继承另一个,那么父类必须 被声明在 子类结构之前。这条规则适用于类继承其他 类和接口。
187在PHP 5.3.0, 可以用一个变量引用类. 变量的值不能是一个关键词 (例如 self, parent and static).
188 (抽象类) 此外方法的签名必须匹配, 也就是类型约束和所需的参数的数目必须相同。 这也适用于 PHP 5.4 起的构造函数。 在 5.4 以前,构造函数签名可能有所不同。
189 实现接口的类必须使用和在该接口中定义的完全相同的方法签名. 不这样做将导致一个致命的错误.
190 属性不能被定义为final, 仅类和方法 可以定义为final.
191 后期静态绑定通过存储最后一个 "非转发调用"的类名工作. 对于静态方法调用, 这是显式命名的类(通常是在::运算符左侧的一个);对于非静态方法调用,是该对象的类。 一个“转发调用”是静态的通过self::,parent::,static::调用的,或者,如果上升到类层次结构,则是由forward_static_call()调用的. 函数 get_called_class()可以用来检索调用类的名称的字符串 并且 static:: 引入了这个类的范围。
192 函数内部使用的变量声明为全局变量时,其名称要与全局变量名称一致.
193 在UNIX环境下,目录中的间隔符是正斜线(/)。如果你使用的是Windows平台,可以使用正斜线或者反斜线。如果使用反斜线,就必须使用转义(escape,标注为一个特殊字符)字符,这样fopen()函数才能正确理解这些字符。要转义一个字符,只需简单地在其前面添加一个反斜线。如下代码所示:$fp=fopen($_SERVER['DOCUMENT_ROOT']."\\..\\orders\\orders.txt",'w');
在PHP代码中,只有少数人会使用反斜线,因为这意味着代码只能在Windows上运行。如果使用了正斜线,代码不需要任何修改就可以在 Windows和UNIX机器上运行。
194 空格的应用:
(1) 空格一般应用于关键字与括号之间,不过需要注意:函数名称与左括号之间不应该用空格分开。
(2) 一般在函数的参数列表中的逗号后面插入空格。
(3) 数学算式的操作数与运算符之间应该添加空格(二进制运算与一元运算除外)。
(4) for语句中的表达式应该用逗号分开,后面添加空格。
(5) 强制类型转换语句中的强制类型的右括号与表达式之间应该用逗号隔开,添加空格。
196 只要在声明类时有一个方法是抽象方法,那么这个类就是抽象类,抽象类也要使用abstract关键字来修饰。在抽象类中可以有不是抽象的成员方法和成员属性。
197 在子类覆盖父类的方法时一定要注意,在子类中重写的方法的访问权限一定不能低于父类被覆盖的方法的访问权限。
198 命名空间名称: PHP 和 php, 并且复合名称以这些名称开始的 (如 PHP\Classes) 是保留给内部语言使用,不应使用在用户空间代码。
199
原创文章,网址 http://blog.p2hp.com/archives/138
最后更新于 2019年1月8日