php 语言总结:基础语法 类型 常量 运算符 流程控制 函数 类与对象 命名空间 超全局变量 垃圾回收机制
1 基本语法 *php标记
echo "Hello world";
// ... more code
echo "Last statement";
// 脚本至此结束,并无 PHP 结束标记
注意:如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。
这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,
而脚本中此时并无输出的意图。
*从html中分离
This will show if the expression is true.
Otherwise this will show.
2 类型 *简介
PHP 支持 8 种原始数据类型。
四种标量类型:
boolean(布尔型)
integer(整型)
float(浮点型,也称作 double)
string(字符串)
两种复合类型:
array(数组)
object(对象)
最后是两种特殊类型:
resource(资源)
NULL(无类型)
Note:查看表达式的值和类型,用 var_dump() 函数,获取类型用gettype(),判断是否为某个类型is_type()
*boolean
要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都不区分大小写
当转换为 boolean 时,以下值被认为是 FALSE:
布尔值 FALSE 本身
整型值 0(零)
浮点型值 0.0(零)
空字符串,以及字符串 "0"
不包括任何元素的数组
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>
*integer
最大值可以用常量 PHP_INT_MAX 来表示
*float
*string
单引号:不会解析里面的变量
双引号:会解析里面的变量
(如果没有变量那么建议使用单引号这样效率会更高点,因为不用解析里面的内容)
复杂(花括号):只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可
// 有效,当在字符串中使用多重数组时,一定要用括号将它括起来
echo "This works: {$arr['foo'][3]}";
// 有效
echo "This works: " . $arr['foo'][3];
?>
*array
// 创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
//删除整个数组unset($array)
?>
*object
要创建一个新的对象 object,使用 new 语句实例化一个类:
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
*resource
像数据库连接就会返回一个资源
*null
NULL 类型只有一个值,就是不区分大小写的常量 NULL。
在下列情况下一个变量被认为是 NULL:
被赋值为 NULL。
尚未被赋值。
被 unset()。
判断是否为null,使用is_null()
2 变量 *基础
$this 是一个特殊的变量,它不能被赋值
变量默认总是传值赋值,也有引用变量,这就意味着改动新变量将影响到原始的变量
*预定义变量
*变量范围
在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内
$a = 1; /* global scope */
function Test()
{
echo $a; /* reference to local scope variable */
}
Test();
?>
和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。
PHP 中全局变量在函数中使用时必须声明为 global
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>
*可变变量
$a = 'hello';
$$a = 'world';
echo "$a ${$a}";
//与以下语句输出完全相同的结果:
echo "$a $hello";
?>
*来自php之外的变量
$_POST $_GET
3 常量 // 合法的常量名
define("FOO", "something");
define("FOO2", "something else");
define("FOO_BAR", "something more");
// 非法的常量名
define("2FOO", "something");
// 下面的定义是合法的,但应该避免这样做:(自定义常量不要以__开头)
// 也许将来有一天PHP会定义一个__FOO__的魔术常量
// 这样就会与你的代码相冲突
define("__FOO__", "something");
?>
4 运算符 *优先级
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
?>
*错误运算符
支持一个错误控制运算符:@,该表达式可能产生的任何错误信息都被忽略掉。
*执行运算符
注意这不是单引号!PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回
使用反引号运算符“`”的效果与函数 shell_exec() 相同。
$output = `ls -al`;
echo "
";
?>
结果:将文件目录结构输出来
*字符串连接运算符
有两个字符串(string)运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。
第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后
$a = "Hello ";
$b = $a . "World!"; // now $b contains "Hello World!"
$a = "Hello ";
$a .= "World!"; // now $a contains "Hello World!"
?>
*数组运算符
$a + $b 联合 $a 和 $b 的联合。
$a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE。
$a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。
$a != $b 不等 如果 $a 不等于 $b 则为 TRUE。
$a $b 不等 如果 $a 不等于 $b 则为 TRUE。
$a !== $b 不全等 如果 $a 不全等于 $b 则为 TRUE。
+ 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);
$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>
数组中的单元如果具有相同的键名和值则比较时相等
$a = array("apple", "banana");
$b = array(1 => "banana", "0" => "apple");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
*类型运算符
instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>
五:流程控制 *if else
*流程控制代替语法
PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。
替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成
endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
A is equal to 5
*while
while (expr):
statement
...
endwhile;
* for
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = sizeof($people); $i {
$people[$i]['salt'] = rand(000000, 999999);
}
?>
*foreach
可以很容易地通过在 $value 之前加上 & 来修改数组的元素。
此方法将以引用赋值而不是拷贝一个值。
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // 最后取消掉引用
?>
*require 和 include
require 出错是会停止脚本程序,include 会产生警告
require_once和require 基本一样,唯一的区别是唯一区别是 PHP 会检查该文件是否
已经被包含过,如果是则不会再次包含。
六 函数 *可变函数
可变函数类似于可变变量
这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。
可变函数可以用来实现包括回调函数,函数表在内的一些用途
function foo() {
echo "In foo()
\n";
}
function bar($arg = '') {
echo "In bar(); argument was '$arg'.
\n";
}
// 使用 echo 的包装函数
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // This calls foo()
$func = 'bar';
$func('test'); // This calls bar()
$func = 'echoit';
$func('test'); // This calls echoit()
?>
*匿名函数
echo preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);
}, 'hello-world');
// 输出 helloWorld
?>
七 类与对象 *基本概念
$this 是一个到主叫对象的引用(通常是该方法所从属的对象)
*属性
在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性。
静态属性则是用 ::(双冒号):self::$property 来访问。更多静态属性与非静态
*类常量
可以把在类中始终保持不变的值定义为常量
class MyClass
{
const constant = 'constant value';
}
?>
*自动加载类
*Static 静态关键字
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)
因为静态方法在编译前就被加载了,所有就不能访问非静态方法,因为他们还不存在
*抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的
*接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
*traits
Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。
Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;
也就是说,应用类的成员不需要继承。
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
*遍历对象
*final关键字
如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
*对象复制
*对象比较
当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,
而且两个对象是同一个类的实例,那么这两个对象变量相等。
而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。
*后期静态绑定
*对象和引用
一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。
*对象系列化
所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字
八 命名空间 *命名空间概述
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
namespace my\name; // 参考 "定义命名空间" 小节
class MyClass {}
function myfunction() {}
const MYCONST = 1;
$a = new MyClass;
$c = new \my\name\MyClass; // 参考 "全局空间" 小节
$a = strlen('hi'); // 参考 "使用命名空间:后备全局函数/常量" 小节
$d = namespace\MYCONST; // 参考 "namespace操作符和__NAMESPACE__常量” 小节
$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // 参考 "命名空间和动态语言特征" 小节
?>
*namespace关键字和__NAMESPACE__常量
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>
*全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,
与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是
全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
namespace A\B\C;
/* 这个函数是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 调用全局的fopen函数
return $f;
}
?>
九 超全局变量 $GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
十 垃圾回收机制 * 引用计数器,每个php变量都保存在一个叫“zval”的变量容器中,除了包含变量的类型和值,
还包括两个字节的额外信息,第一个是“is_ref”是一个bool 值 用来标识是否属于引用集合
第二个额外的字节是refcount 用于统计引用次数
$a = "new string";
xdebug_debug_zval('a');
?>
结果:a: (refcount=1, is_ref=0)='new string'
* 如果一个引用计数增加 它将继续呗使用,如果引用计数减少到0,所在变量容器将呗清零(free)