批改状态:合格
老师批语:
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();
<?phpclass 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);}}
<?phprequire '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 元";}}
<?phprequire '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) . ' 元';}}
-实例化
<?phprequire '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
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号