目录
PHP 脚本以 <?php 开始,以 ?> 结束:
php
<?php
// PHP 代码
?>
输出语句
PHP 中使用 echo
和 print
语句来输出数据。
echo 和 print 区别:
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1
php
<?php
echo "Hello, World!";
?>
会输出Hello,World!
注释
PHP 支持三种注释方式:
单行注释:使用 //
单行注释:使用 #
(较少使用)
多行注释:使用 /* */
php
<?php
// 这是一个单行注释
# 这也是一个单行注释
/*
这是一个多行注释
*/
?>
注释部分的代码不会被编译。
数据类型(变量)
变量是用于存储信息的"容器"
PHP 支持多种数据类型,包括但不限于:
字符串 (string
):一系列字符。
整型 (integer
):没有小数点的数字。
浮点型 (float
):带有小数点的数字。
布尔型 (boolean
):只有两个可能的值,true
和 false
。
数组 (array
):存储多个值的集合。
对象 (object
):面向对象编程中的实例。
NULL:表示一个未定义的变量。
PHP 中的变量总是以 $
符号开始,后面跟着变量名。
php
<?php
$myVar = "Hello";
echo $myVar;
?>
会输出Hello。
局部和全局作用域
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字(这一点与c语言不同)。
php
<?php
$x=5;
$y=10;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
PHP 将所有全局变量存储在一个名为 $GLOBALS[index ] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
php
<?php
$x=5;
$y=10;
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;
?>
这样写也是正确的。
类型比较(松散比较与严格比较)
松散比较:使用两个等号 == 比较,只比较值,不比较类型。
严格比较:用三个等号 === 比较,除了比较值,也比较类型。
例如,"42" 是一个字符串而 42 是一个整数。FALSE 是一个布尔值而 "FALSE" 是一个字符串。
42与"42"值相等(使用==返回true)类型不同(使用===返回false)
常量
PHP 中的常量是指一旦定义后其值不能被改变的标识符。
常量值被定义后,在脚本的其他任何地方都不能被改变。
常量可以用 define() 函数或 const 关键字来定义。
运算符
大部分与c语言相同,现列举几个c语言里没有的:
并置运算符
并置运算符 (.) 用于把两个字符串值连接起来。
例如:
php
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
上面的代码将输出:Hello world! What a nice day!
a .= b相当于a = a . b。
不等于
php里不等于可以使用与c语言相同的!=也可以使用x <> y,也表示不等于。
还有绝对等于x === y,如果 x 等于 y,且它们类型相同,则返回 true。
不绝对等于x !== y,如果 x 不等于 y,或它们类型不相同,则返回 true。
除了值相等以外,类也会判断是否相同。
逻辑运算符
与可以使用&&或者and,或可以使用||或者or。
还有异或符号x xor y,如果 x 和 y 有且仅有一个为 true,则返回 true。
条件语句
与c语言基本相同。elseif它的else与if中间不用空格。
if 语句 - 在条件成立时执行代码
if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码
if...elseif....else 语句 - 在若干条件之一成立时执行一个代码块
switch 语句 - 在若干条件之一成立时执行一个代码块
php
if ($x > 0) {
echo "正数";
} elseif ($x == 0) {
echo "零";
} else {
echo "负数";
}
数组
数组能够在单个变量中存储多个值:
php
<?php
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>
同样类似于c语言。
运行结果为:I like Volvo, BMW and Toyota.
在 PHP 中,array() 函数用于创建数组
php
$cars=array("Volvo","BMW","Toyota");
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";
这两种赋值方式均可。
count($数组名);可以返回数组的长度。
关联数组
php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
类似于c++里stl中的一些东西,构成了键值对。
php
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
运行结果为:Peter is 35 years old.
遍历关联数组使用foreach
php
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
运行结果为:
Key=Peter, Value=35
Key=Ben, Value=37
Key=Joe, Value=43
数组排序
一般数组
php
sort($数组名)
按照值升序排列。
php
rsort($数组名)
按照值降序排列。
关联数组
php
asort($数组名)
根据数组的值,对关联数组进行升序排列。
php
arsort($数组名)
根据数组的值,对关联数组进行降序排列。
php
ksort($数组名)
根据数组的键,对关联数组进行升序排列。
php
krsort($数组名)
根据数组的键,对关联数组进行降序排列。
循环
while,do while,for循环与c语言一致。
唯一要注意foreach循环。foreach 循环用于遍历数组。
php
foreach ($array as $value)
{
要执行代码;
}
每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。
php
foreach ($array as $key => $value)
{
要执行代码;
}
每一次循环,当前数组元素的键与值就都会被赋值给 $key 和 $value 变量(数字指针会逐一地移动),在进行下一次循环时,你将看到数组中的下一个键与值。
php
<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{
echo $value . PHP_EOL;
}
?>
运行结果为:
Runoob
Taobao
函数
语法:
php
<?php
function functionName()
{
// 要执行的代码
}
?>
和JavaScript很相似,以function开头表示这是一个函数后面跟着它的名字。
其它与c语言类似,有可以有传入值,通过return返回值。
变量函数
变量函数是指在 PHP 中,将一个变量作为函数名来调用的函数。
php
$func = 'foo';
$func(); // 调用 foo()函数
$func = 'bar';
$func('test'); // 调用 bar()函数
$func = 'echoit';
$func('test'); // 调用 echoit()函数
魔术常量
__LINE__用于显示文件中的当前行号。
__FILE__用于显示文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__显示用于文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__FUNCTION__在函数类返回该函数被定义时的名字(区分大小写)。
__CLASS__在类里面返回该类被定义时的名字(区分大小写)。
__TRAIT__实现代码复用,优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
__METHOD__显示类的方法名,返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__得到当前命名空间的名称(区分大小写)。
命名空间
用来解决重名问题。
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
php
<?php
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
// ... 代码 ...
同一个文件中可以有不同的命名空间。建议使用大括号括起来。
php
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
超级全局变量
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
php
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
相当于z = x + y。
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。具体查每样信息的语法可以百度查询。
PHP $_REQUEST 用于收集HTML表单提交的数据。
php
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
php
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_POST['fname'];
echo $name;
?>
</body>
</html>
PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
面向对象
类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象 − 是类的实例。
成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可成为对象的属性。
成员函数 − 定义在类的内部,可用于访问对象的数据。
继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
子类 − 一个类继承其他类称为子类,也可称为派生类。
多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
使用new运算符创建对象。
php
$runoob = new Site;
$taobao = new Site;
$google = new Site;
构造与析构函数
在c++中构造函数与类同名,析构函数是构造函数名前加上一个~,但在php里构造函数与析构函数有固定的名字:
__construct与__destruct
构造函数:
php
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
析构函数:
php
function __destruct() {
print "销毁 " . $this->name . "\n";
}
继承
继承使用extends,php不支持多继承。
php
class Child extends Parent {
// 代码部分
}
方法重写和访问权限基本与c++相同,不多赘述。
接口interface
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
php
<?php
// 声明一个'iTemplate'接口
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 实现接口
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
php
const constant = '常量值';
抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
类似于多态。
php
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . PHP_EOL;
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>
static与final关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。静态属性不可以由对象通过 -> 操作符来访问。
php
public static $my_static = 'foo';
如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。
java里使用的是super,php使用用parent。
php
parent::__construct();