函数、类与对象
1.函数、类与对象
<?php
//todo 函数
// 1. 声明:php7.3之后,强制要求定义参数类型(强类型)
function sum(int $a, int $b): void
{
// 返回 int
// return $a + $b;
//返回类型:string
// return '$a + $b =' . ($a + $b);
// 直接打印,没有return
// vprintf("%d + %d = %d", [$a,$b,$a+$b]);
}
// 2.调用
// echo sum(10, 20);
// echo sum(10,'php');
// 3.参数
// PHP禁止函数重载,同一作用域,存在同名函数,根据参数不同判断调用那个函数
function sum1(int $a, int $b, int $c = 0): int
{
return array_sum([$a, $b, $c]);
}
// 3.1 参数太少
echo sum1(1, 2, 3), "\n";
// echo sum1(1, 2), "\n";
// 3.2 参数太多:可变参数(js,...rest)
function sum2(...$args): int
{
return array_sum($args);
}
// echo sum2(1, 2, 3, 4, 5) . "\n";
// ...rest用在调用时,执行的不是压入,而是展开
// $arr = [1,2,3,4,5];
// range函数,第1位是开始数,第2位是结束数,第3位是步长
$arr = range(1, 9, 2);
// echo sum2(...$arr);
// 3.3 引用参数
function sum3($a)
{
return $a + 10 ."\n";
}
$a = 10;
echo sum3($a);
// 4.返回值,默认单值,多值返回用数组
function fn1(){
// return ['admin','admin@qq.com'];
return ['name'=>'admin','email'=>'admin@qq.com'];
}
print_r(fn1());
// list($name,$email) = fn1();
//简化
// [$name,$email] = fn1();
['name'=>$name,'email'=>$email] = fn1();
echo "$name ( $email )";
echo "\n";
function add($a,$b,$c){
return array_sum([$a,$b,$c]);
}
echo add(10,20,30) . "\n";
//回调的方式调用一个函数
echo call_user_func('add',20,30,40) . "\n";
echo call_user_func_array('add',[30,40,50]) . "\n";
2.类与对象
<?php
// 类与对象
/**
* class:声明类
* new:类的实例化
* public:访问限制符(公开成员/默认值)
* private:仅限类中访问
* $this:当前类实例的引用,只能用在类中
* __get($name):属性重载,拦截非法属性读访问
* __get($name,$value):属性重载,拦截非法属性写属性
*/
//类声明
class Demo
{
//属性:变量
// 访问限制符+属性:public,公开成员(默认)
public string $name;
private int $salary;
// 构造方法:在类实例化时自动调用
// __method:魔术方法,用户不能直接调用,由php调用
// 用途:给属性设置初始化值
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
// 内部方法
// public function getSalary()
// {
// return $this->salary;
// }
// public function setSalary($value)
// {
// return $this->salary = $value;
// }
// 属性重载,拦截外部的非常属性访问
// __get()获取器,当获取一个不存在的或无权限访问的属性时触发
public function __get($name)
{
if ($name === 'salary') {
return $this->$name;
}
}
// __get()设置器,两个参数(属性名,新值)
public function __set($name, $value)
{
$this->$name += $value;
}
//格式化打印
private function hello()
{
return <<< DATA
$this->name :
工资($this->salary)
年龄($this->age)
DATA;
}
//普通方法重载:__call()
// $name:方法名称,$arguments:参数数组
public function __call($name, $arguments)
{
// return $name . ',' . join('.', $arguments);
if ($name === 'hello') {
return <<< DATA
$this->name :
工资($this->salary)
年龄($this->age)
DATA;
}
if($name === 'sum'){
return array_sum($arguments);
}
}
}
// 类实例化:对象
$obj = new Demo('老马', 6000);
// var_dump($obj);
// 调用内部方法
// echo $obj->getSalary() . "\n";
// $obj->setSalary(8000) . "\n";
// echo $obj->getSalary() . "\n";
// 调用设置器和获取器
echo $obj->salary . "\n";
$obj->salary = 3000;
echo $obj->salary . "\n";
$obj->age = 40;
echo $obj->age, "\n";
echo $obj->hello('a','b','c') . "\n";
// call_user_func
// call_user_func_array
// 用它调用对象的方法
echo call_user_func([$obj,'sum'],10,20,30) . "\n";
echo call_user_func_array([$obj,'sum'],[40,50,60]) . "\n";