PHP为解释执行,首先将源码编译为opcode指令集合,后PHP虚拟机解释执行opcode。PHP8又引入了JIT编译。PHP程序执行由Zend引擎完成,底层是C语言实现。
PHP 源码目录:
PHP变量为弱类型,类型在运行时动态决定,底层由结构体zval表示,占16字节。
$an_int = 12; // 变量声明
var_dump() // 表达式的值和类型
gettype() // 表达式的类型
is_int() // is_type函数,检查类型
$foo = (int) $bar; // 强制类型转换
引用:
$a =& $b; // 意味着 $a 和 $b 指向了同一个变量
变量的作用域:
局部变量、全局变量、静态变量、常量
智能字符串:
smart_str,用于频繁对一个字符串进行扩容修改。
数组的语义:
数组的数据结构:
packed array 和 hash array:
$a = array(1,2,3); // packed array
$b = array('x'=>1, 'y'=>2, 'z'=>3); // hash array
class SimpleClass extends BaseClass {
// 常量
const CONST_VALUE = 'A constant value';
// 声明属性
public $var = 'a default value';
// 构造方法
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
// 声明方法
public function displayVar() {
echo $this->var;
}
}
$obj = new SimpleClass();
echo $obj::CONST_VALUE;
echo SimpleClass::CONST_VALUE;
可见性:public(默认)、protected、private
static:静态属性/方法,可以直接通过类访问
final:final方法无法被子类覆盖,final类不能被继承
抽象类和接口:
abstract class AbstractClass {
abstract protected function getValue();
}
interface iTemplate {
public function setVariable($name, $var);
}
trait:
组合的代码复用方式;
当前类的成员覆盖 trait 的方法,而 trait 覆盖被继承的方法;
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
// 使用多个trait
class Aliased_Talker {
use A, B {
B::smallTalk insteadof A; // 同名时使用B的smallTalk
B::bigTalk as talk; // B的bigTalk起一个别名
}
}
匿名类:
var_dump(new class(10) {
private $num;
public function __construct($num) {
$this->num = $num;
}
});
重载:
PHP的重载指动态地创建类属性和方法。
重载方法必须声明为 public。
// 以下“不可访问”指未定义或不可见
// 在给不可访问属性赋值时,__set() 会被调用。
public __set ( string $name , mixed $value ) : void
// 读取不可访问属性的值时,__get() 会被调用。
public __get ( string $name ) : mixed
// 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
public __isset ( string $name ) : bool
// 当对不可访问属性调用 unset() 时,__unset() 会被调用。
public __unset ( string $name ) : void
// 在对象中调用一个不可访问方法时,__call() 会被调用。
public __call ( string $name , array $arguments ) : mixed
// 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
public static __callStatic ( string $name , array $arguments ) : mixed
遍历属性:
// 遍历所有可见属性
foreach($objA as $key => $value) {
print "$key => $value\n";
}
也可以实现 Iterator 接口或 IteratorAggregate 接口,自行决定如何遍历。
魔术方法:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __serialize(), __unserialize(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法。
自定义方法建议不要以 __ 为前缀。
对象复制:
// 浅拷贝
$copy_of_object = clone $object;
对象比较:
后期静态绑定:
用于在继承范围内引用静态调用的类。
class A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__." ";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function who() {
echo __CLASS__." ";
}
}
class C extends B {
public static function who() {
echo __CLASS__." ";
}
}
C::test(); // 输出 A C C
协变与逆变:
协变使子类比父类方法能返回更具体的类型; 逆变使子类比父类方法参数类型能接受更模糊的类型。
CGI 是一种数据协议,用来规范web服务器传输到php解释器中的数据类型以及数据格式,包括URL、查询字符串、POST数据、HTTP header等。CGI程序可以由不同语言实现。
PHP Web服务处理请求过程:
CGI 与 Servlet 的区别:
因为CGI效率低,但对配置很敏感,通常被用在开发和调试阶段。
FastCGI:
FastCGI 是 CGI 的增强版本,主要用来提高CGI程序性能,同样可以由不同语言实现。工作方式:
PHP SAPI(Server Application Programimg Interface):
Nginx + PHP-FPM 模式:
PHP-FPM 进程有三种设置方式:
条件语句:
if…elseif…else 、 switch…case
循环语句:
while 、 do…while 、 for 、 foreach
break 、 continue
代替语法:
把左花括号 { 换成冒号 :,把右花括号 } 分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;
if ($a == 5):
echo "a equals 5";
else:
echo "a is not 5";
endif;
goto:
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
match:
$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};
生成器:
yeild
function makeRange($length) {
for($i = 0; $i < $length; $i++) {
yield $i;
}
}
foreach (makeRange(100) as $i) {
echo $i . PHP_EOL;
}
闭包(匿名)函数:
$message = 'hello';
// 继承 $message
$example = function () use ($message) {
var_dump($message);
};
$example();
箭头函数:
匿名函数和箭头函数都是 Closure 类的实现
$y = 1;
// 可以自动捕获变量的值
$fn1 = fn($x) => $x + $y;
var_export($fn1(3));
Callable 类型:
// An example callback function
function my_callback_function() {
echo 'hello world!';
}
// An example callback method
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Type 1: Simple callback
call_user_func('my_callback_function');
// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));