注释
和C/C++一样
单行注释://
多行注释:/**/
变量
和C/C++一样。然而,在PHP中必须将 $ 符号放在所有变量之前。这使得PHP语言解析速度更快,因为解析器只要碰见这个符号就会立即知道接下来的是一个变量。《Learning PHP MySQL & JavaScript, 4th Edition》书中,对变量,数组,二维数组做了个很好的比喻,把变量名想象成小抽屉,变量值想象成抽屉里面的内容。
字符串
$username = "Fred Smith";
数组
$team = array('Bill', 'Mary', 'Mike', 'Chris', 'Anne');
二维数组
$oxo = array(array('x', ' ', 'o'), array('o', 'o', 'x'), array('x', 'o', ' '));
值传递 VS 引用传递
PHP习惯于在变量之前加上&符号来告诉解析器传一个引用给变量,而不是变量的值。值传递相当于把抽屉里面的字条内容抄写一份,然后原纸条放回盒子。引用传递相当于在盒子中字条上栓上一根线,调用者顺着这条线能把纸条扯出来。
PHP中,对象间赋值就是引用传递,因此一个对象属性的改变也会反映在另一个对象身上,为了解决这个问题,PHP使用clone方法
<?php $object1 = new User(); $object1->name = "Alice"; $object2 = clone $object1; $object2->name = "Amy"; echo "object1 name = " . $object1->name . "<br>"; echo "object2 name = " . $object2->name; class User { public $name; } ?>
预定义变量
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。这些超全局变量是:
在使用超级全局变量之前要小心,因为它们经常被黑客用来作为寻找入侵你网站的突破口。黑客们使用恶意代码加载$POST,$GET或其他超级全局变量,例如,如果你随意地访问了UNIX或MYSQL之类的命令,就可能损坏或显示敏感数据。所以,在使用超级全局变量之前总要对它们进行清洁处理。有一种处理方法是运用PHP的htmlentities函数。它将所有字符转变为HTML实体。例如,小于和大于字符(<和))被转换成字符串&1t;和>;以便安全提交,因为这些内容都是一些引号和反斜杠等。所以,一个访问$SERVER更好的方法是:
$came_from = htmlentities($_SERVER['HTTP_REFERER']);
多行文本
方法一:使用引号
<?php $author = "Steve Ballmer"; echo "Developers, Developers, developers, developers, developers, developers, developers, developers, developers! - $author."; $text = "Measuring programming progress by lines of code is like Measuring aircraft building progress by weight. - $author."; ?>
方法二:deredoc
这种做法和Linux cat命令的heredoc用法一样
<?php $author = "Brian W. Kernighan"; echo <<<_END Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. - $author. _END; ?>
常量
define
define函数一般用于创建全局常量
define("ROOT_LOCATION", "/usr/local/www/");
const
const一般用于定义类内部的常量
<?php Translate::lookup(); class Translate { const ENGLISH = 0; const SPANISH = 1; const FRENCH = 2; const GERMAN = 3; static function lookup() { echo self::SPANISH; } } ?>
无论const还是define,使用常量时都不可以加 $
预定义常量
作用域
与C/C++一样,也有local、global、static的说法。
- 局部变量只能在它们被定义的范围内访问。如果它们在函数外,可以被函数、类等以外的所有代码访问。如果变量位于函数内,只有函数可以访问该变量,并且它的值在函数返回时被释放。
- 全局变量可以在任何地方访问。
- 静态变量只能够在定义它们的函数内被访问,但是在多次调用时保持它们的值。
流程控制
与C/C++用法一直,《Learning PHP MySQL & JavaScript, 4th Edition》书中有几幅图形象描述了流程控制逻辑
if
if else
if elif else
各种循环
foreach...as
使用foreach...as循环遍历数值数组
<?php $paper = array("Copier", "Inkjet", "Laser", "Photo"); $j = 0; foreach($paper as $item) { echo "$j: $item<br>"; ++$j; } ?>
使用foreach...as循环遍历关联数组
<?php $paper = array('copier' => "Copier & Multipurpose", 'inkjet' => "Inkjet Printer", 'laser' => "Laser Printer", 'photo' => "Photographic Paper"); foreach($paper as $item => $description) echo "$item: $description<br>"; ?>
引入外部文件
与C/C++中包含头文件类似,PHP也有include关键字,与C/C++稍有区别。首先PHP的include没有防卫式声明,这意味着项目规模变大时,可能会重复引入相同文件。这会产生错误信息,因为在试图多次定义同名的常量或函数。PHP为解决这个问题使用include_once。解决了重复包含问题,include系列还有个问题,就是他只会试图导入文件,找不到也没关系,不会报错继续执行。解决这个问题,PHP使用require,与include一样,也有个require_once。
类
public,protected,private
与C++一样,也有public,protected,private。类内部属性默认情况下是public,C++默认是private。
- 当外部代码需要访问这个成员,派生类要继承时,使用public。
- 当外部代码不能访问这个成员,而派生类可以继承时,使用protected。
- 当外部代码不能够访问这个成员,派生类也不能够继承时,使用private。
extends
extends操作符表明一个类继承自另一个类
parent、final
C++中类继承时存在同名隐藏问题,即子类方法会隐藏父类同名方法。PHP也有这个问题,解决之道是调用父类方法时显式加上parent关键字
如果父类方法被声明为final的,则子类不能隐藏父类同名方法