Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:
oop: 直接面向对象编程(封装了变量和函数的一个编程单元)
面向过程认识
<?php
// 变量
$n= 100;
$m=200;
// 函数
function sum($a,$b){
return $a+$b;
};
echo sum($n,$m);
面向对象封装
类的公有属性
<?php
// 声明的类与文件一致
class Product
{
// 类成员:属性,方法
// 属性:变量
// public 公开指定name是公开属性(公有属性)
public $name;
public $price;
// 方法:函数
// 构造方法
// 双下划线的方法:魔术方法,由系统自动调用
// 类实例化的时候会调用它
public function __construct($name, $price)
{
// 初始化类成员,让类实例化确定下来
//this $当前类实例的引用
$this->name = $name;
$this->price = $price;
// 不用return返回
}
public function show(): string
{
return "$this->name : $this->price 元";
}
}
<?php
<?php
// 导入文件
require 'Product.php';
$moblie=new Product('电脑',888);
echo $moblie->name;
echo '<hr>';
var_dump($moblie);
<?php
// 声明的类与文件一致
class Product
{
// 类成员:属性,方法
// 属性:变量
//protected: 受保护成员,仅限本类以及子类访问
protected $name;
protected $price;
// 方法:函数
// 构造方法
// 双下划线的方法:魔术方法,由系统自动调用
// 类实例化的时候会调用它
public function __construct($name, $price)
{
// 初始化类成员,让类实例化确定下来
//this $当前类实例的引用
$this->name = $name;
$this->price = $price;
// 不用return返回
}
public function show(): string
{
return "$this->name : $this->price 元";
}
}
<?php
// 导入文件
require 'Product.php';
$moblie=new Product('手机',888);
echo $moblie->show();
在加载器中引入,访问实例化类的方法
<?php
// 类的自动加载
spl_autoload_register(function($class){
require $class.'.php';
});
静态属性与静态方法
<?php
// 类的自动加载器
require 'loader.php';
// 实例化
$snack = new Product('冰块',11);
echo $snack->show();
<?php
class Staff{
// 静态属性
public static $name;
public static $id;
// 构造函数
public function __construct($name,$id)
{
self::$name = $name;
self::$id = $id;
}
// 静态方法
public static function show(){
return sprintf('%s, 这个月工资: %d', self::$name, self::$id);
}
}
<?php
require 'loader.php';
$staff = new Staff('刘五',66);
// 访问类的静态属性
echo Staff::$name;
echo' <hr>';
// 访问类的静态方法
echo Staff::show();
echo' <hr>';
// 访问实例的静态方法
echo $staff->show();
// 不能访问实例的静态属性
父类
<?php
// 声明的类与文件一致
class Product
{
// 类成员:属性,方法
// 属性:变量
//protected: 受保护成员,仅限本类以及子类访问
protected $name;
protected $price;
// 方法:函数
// 构造方法
// 双下划线的方法:魔术方法,由系统自动调用
// 类实例化的时候会调用它
public function __construct($name, $price)
{
// 初始化类成员,让类实例化确定下来
//this $当前类实例的引用
$this->name = $name;
$this->price = $price;
// 不用return返回
}
public function show(): string
{
return "$this->name : $this->price 元";
}
}
<?php
require 'loader.php';
// sub继承product类
class Sub extends Product{
// 对父类方法重写
// 对父类的功能的扩展
#子类构造器
private $num;
public function __construct($name,$price,$num)
{
// 调用父类构造方法
parent::__construct($name,$price);
// 添加子类构造方法
$this ->num = $num;
}
// 输出方法
public function show():string
{
// parent调用父类方法
return parent::show().", 数量: $this->num 个";
}
// 子类里面定义新的方法,与show无关系
public function total()
{
return "$this->name, 总计: ". ($this->price * $this->num) . ' 元';
}
}
-实例化
<?php
require 'loader.php';
// 20是子类继承父类添加的方法
// 实例化子类sub
$sub =new Sub('好面包',40,20);
echo $sub->show();
echo '<hr>';
// 重新定义的方法,与父类无关系
echo $sub->total();
<?php
// 当父类,trait,与当前子类中存在同名成员的如何解决?
// 父类
class P
{
public function m1()
{
return __METHOD__;
}
}
# trait像类不是类,想当于中介
trait T
{
// public function m1()
// {
// return __METHOD__;
// }
}
// 子类
class A extends P
{
use T;
// 在子类中将父类的m1进行了重写
// public function m1()
// {
// return __METHOD__;
// // return parent::m1();
// }
}
// 当子类与父类存在同名成员时,子类优先
echo (new A)->m1(), '<br>';
// 当trait中存在与父类同名的成员时,trait优先
// own > trait > parent