1.函数
<?php
//todo 函数
// 1.声明
function sum(int $a, int $b): string
{
return vsprintf("%d + %d =%d\n", [$a, $b, $a + $b]);
}
// 2.调用
echo sum(10, 20);
// 3.参数
function sum1(int $a, int $b, int $c = 0): int
{
return array_sum([$a, $b, $c]);
}
echo sum1(1, 2, 3), "\n";
// 3.1 参数太少,默认参数
echo sum1(1, 2), "\n";
// 3.2参数太多,可变参数
function sum2(...$args): int
{
return array_sum($args);
}
echo sum2(1, 2, 3, 4, 5, 6), "\n";
$arr = range(1, 6);
// ...rest在调用的时候,执行的不是压入.而是展开
echo sum2(...$arr), "\n";
// 3.3 引用参数
// '&'引用参数地址
function sum3(&$a)
{
return $a += 10;
}
$a = 10;
echo sum3($a), "\n";
echo '$a =' . $a, "\n";
// 4.返回值
// 默认单值, 多值返回数组
function fn1()
{
// return ['admin', 'admin@php.cn'];
return ['name' => 'zhulaoshi', 'email' => 'zhulaoshi@php.cn'];
}
print_r(fn1());
// 解构
['name' => $name, 'email' => $email] = fn1();
echo "$name ( $email ) \n";
// 回调函数
echo call_user_func('sum2', 1, 2, 3, 4, 5, 6) . "\n";
echo call_user_func_array('sum2', [1, 2, 3, 4, 5, 6]);
2.对象与类
<?php
// 类与对象
/**
* class: 声明类
* new: 类的实例化
* public: 访问限制符(公开成员/默认值)
* private: 访问限制符(私有成员,仅在类中访问,类外不可见)
* __construct(): 构造方法(实例化时调用,用于初始化类实例)
* $this: 当前类实例的引用,只能用在类中
* __get($name): 属性重载,拦截非法属性"读"访问
* __set($name,$value): 属性重载,拦截非法属性"写"访问
* __call($name,$arguments): 方法重载,拦截非法的方法访问
*/
// class: 声明类
class Demo
{
// 属性: 变量
// 访问限制符: public公开成员(默认值)
public string $name;
private int $salary;
private int $age;
// 方法: 函数
// 构造方法: 在类实例化时自动调用
// __method: 魔术方法,用户不能直接调用,由PHP调用
// 用途: 创建实例初始化状态,属性赋值,调用方法
public function __construct($name, $salary, $age)
{
$this->name = $name;
$this->salary = $salary;
$this->age = $age;
}
// 属性重载, 拦截外部的非法属性访问
// __get()获取器,当获取一个不存在或无权限访问的属性时触发
public function __get($name)
{
$result = 0;
if ($name === 'salary') {
$result = $this->$name - 5000;
} else {
$result = $this->$name;
}
return $result;
}
// __set(属性名,新值)
public function __set($name, $value)
{
if ($name === 'salary') {
$this->$name += $value;
} else {
$this->$name = $value;
}
}
// 格式化打印
private function hello()
{
return <<< DATA
$this->name :
工资($this->salary)
年龄($this->age)
DATA;
}
// 方法重载
public function __call($name, $arguments)
{
if ($name === 'hello') {
return <<< DATA
$this->name :
工资($this->salary)
年龄($this->age)
DATA;
}
if ($name === 'sum') {
return array_sum($arguments);
}
}
}
// 类实例化: 对象
$obj = new Demo('王老师', 8000, 30);
echo $obj->salary . "\n";
$obj->salary = 2000;
echo $obj->salary, "\n";
$obj->age = 40;
echo $obj->age, "\n";
echo $obj->hello(), "\n";
// call_user_func
// call_user_func_array
// 用它调用对象的方法
echo call_user_func([$obj, 'sum'], 1, 2, 3) . "\n";
echo call_user_func_array([$obj, 'sum'], [1, 2, 3]) . "\n";