类与对象、oop封装性、构造器,魔术方法的应用
一、类与对象、oop封装性、构造器
二、魔术方法的应用(属性重载与方法重载)2.1、属性重载
2.2、方法重载 _call()
三、类的原生自动加载类的自动加载器 autoload.php
四、类的继承与功能扩展父类 Product.php
/**
* 1. 类文件名称与类名称一样
* 2. 变量是实现数据的复用,函数是实现了代码块的复用
* 3. 类是具有相同属性和方法的对象的集合
* 4. 对象 是复合数据类型
* 5. oop 单位是对象,对象是类实例化的结果
*/
// ! 1. 类 与 对象
class User
{
// 成员属性,一定要有访问修饰符
// ! 2. OOP封装性
/**
* public: 公共的(类外可以访问)
* private: 私有的(只能本类访问)
* property:受保护的(仅对本类和子类访问,类外无法访问)
* 构成OOP封装性(继承、多态)
*/
public string $name; // 定义增加类型,
private int $salary;
protected int $age;
// 魔术方法 必须是公有的,为系统所调用,用户不能直接调用
// __set __get _call __callStatic
// ! 3 构造器
// 特殊的成员方法 __construct
// 用途:创建实例化出事状态,属性赋值(私有属性),调用方法
public function __construct($name,$salary,$age)
{
// 代表本对象
$this->name = $name;
$this->salary = $salary;
$this->age = $age;
}
// 成员方法:
public function say(){
return $this->name . '会说话,他现在的工资是' . $this->salary;
}
}
// 实例化
//$james = new User();
$james = new User('Jordan', 10000, 18);
//var_dump($james);
// 给对象属性赋值
$james->name = 'Jordan';
// 对象属性访问: ->
echo "<pre>";
echo $james->name;
二、魔术方法的应用(属性重载与方法重载)2.1、属性重载
// 属性拦截器 重载
// 访问当前环境下不存在 或者不可见的成员时,会被自动调用
// 原始属性value不会因此而改变
public function __get($name){
$res = 0;
if($name === 'salary')
{
$res = $this->$name - 5000;
}else{
$res = $this->$name;
}
return $res;
}
// 未当前环境下不存在,或者不可见的成员赋值时,会被自动调用
// 原始属性value会根据而改变
public function __set($name, $value)
{
if($name === 'salary')
{
$this->$name += $value;
} else {
$this->$name = $value;
}
}
//实例化
$james = new User();
// 对象属性访问: ->
echo "<pre>";
echo $james->name . '<br />';
echo $james->salary. '<br />'; //5000 __get
var_dump($james); // 10000
$james->salary = 2000; // __set
echo $james->salary. '<br />'; // 7000
var_dump($james); // 12000
2.2、方法重载 _call()
// ! 4. 魔术方法 __call()
// 方法重载
public function __call($name, $args)
{
if($name == 'hello')
{
return <<<DATA
$this->name:
工资($this->salary)
对象($this->age)
DATA;
}
if ($name == 'sum') {
return array_sum($args);
}
}
//实例化
$james = new User();
// 方法:
echo $james->say() . '<br />';
echo $james->hello() . '<br />';
echo call_user_func([$james, 'sum'],10,20,30) . '<br />';
echo call_user_func_array([$james,'sum'],[10,20,30]);
三、类的原生自动加载类的自动加载器 autoload.php
引入类的自动加载器 client.php
<?php
// 类的自动加载器
spl_autoload_register(function ($className) {
//var_dump($className);
$classFile = __DIR__ . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . $className . '.php';
if(is_file($classFile) && file_exists($classFile))
require $classFile;
});
<?php
// 客户端代码
// 引入类的自动加载器
require __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';
/*
require __DIR__ . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'Product.php';
require __DIR__ . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'User.php';
*/
echo "<pre>";
$i = new Product("iphone 14 pm", 9999, 12);
echo $i->show() . "<pre>";
$u = new User("peter",12000,12);
echo $u->say();
四、类的继承与功能扩展父类 Product.php
Son类 Son.php:继承与功能扩展
<?php
class Product
{
public string $name;
protected float $price;
protected int $num;
public function __construct($name, $price, $num)
{
$this->name = $name;
$this->price = $price;
$this->num = $num;
}
// 普通方法
public function show()
{
return <<<SHOW
1.品名:$this->name
2.价格:$this->price
3.属性:$this->num
SHOW;
}
}
【感谢龙石为本站提供api接口平台 http://www.longshidata.com/pages/apigateway.html】
<?php
// 类的继承 扩展 extends
// Son 继承 Product
class Son extends Product
{
// 扩展父类属性
public string $brand;
public function __construct($name, $price, $num, $brand)
{
// 扩展父类功能
// parent::调用父类成员
// self:: 类的引用,静态成员的访问
parent::__construct($name, $price, $num);
$this->brand = $brand;
}
// 重写 出现再成绩上下文里
public function show()
{
return parent::show() . <<<SON
4.品牌:$this->brand
SON;
}
// 扩展功能
public function total()
{
return "$this->name,数量为{$this->num},总计:" . ($this->price * $this->num) . "元";
}
}