Blogger Information
Blog 37
fans 1
comment 0
visits 32498
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP面向对象编程
Jason Pu?
Original
682 people have browsed it

一.类的创建和实例化

类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。
基本语法:

  1. class 类名{
  2. //属性:变量
  3. //构造函数:实例化类的时候就会调用它,如果有参数,在实例化类的时候必须填入参数
  4. //方法:函数
  5. }

类的属性和方法有三种,分别是:
1.public:公开的
2.privote:私有成员,只有本类中使用
3.protedcted:被保护的,仅限本类和子类访问

例如我们可以写一个类并实例化:

  1. class Calculation{
  2. //类的属性:
  3. protected $price;
  4. public $name;
  5. //构造函数:
  6. public function __construct($name,$price)
  7. {
  8. $this->name=$name;
  9. $this->price=$price;
  10. }
  11. //类的方法
  12. public function count():string
  13. {
  14. return "商品名称:$this->name,单价:$this->price";
  15. }
  16. };

类的实例化:

  1. $bill = new Calculation("iphone 12",8888);
  2. echo $bill->count();//商品名称:iphone 12,单价:8888

访问类中的属性:

  1. echo $bill->name;//iphone 12
  2. echo "<hr>";

二.静态(static)成员

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
例如:

  1. class Demo{
  2. public static $price;
  3. public static $name;
  4. public function __construct(int $price,string $name)
  5. {
  6. // 静态成员与实例无关,所以不能用$this访问
  7. self::$price=$price;
  8. self::$name=$name;
  9. }
  10. // 静态方法
  11. public static function amountto():string
  12. {
  13. return sprintf('品名:%s,单价:%d',self::$name,self::$price);
  14. }
  15. }
  1. $test1 = new Demo(8888,"苹果");
  2. //在外部调用静态方法:
  3. echo Demo::amountto();//品名:苹果,单价:8888

普通的方法也是可行:

  1. echo $test1->amountto();

访问静态属性:

  1. echo Demo::$name;//苹果
  2. echo Demo::$price;//8888

但是静态属性不能用普通的访问方法


三.类的扩展(extends)

类的扩展,也叫类的继承,达到类的复用的目的,扩展有二个方法:一是对父类方法的重写,二是对父类功能的扩充
例如:

  1. class Son extends Calculation{
  2. //扩展一个属性:
  3. private $quantity;
  4. //重写一下父类的构造器:
  5. public function __construct(string $name, float $price,int $quantity)
  6. {
  7. //调用一下父类的成员:
  8. parent::__construct($name, $price);
  9. $this->quantity=$quantity;
  10. }
  11. //再给子类添加一个自己的方法:
  12. function calculator(){
  13. return sprintf("品名:%s,单价:%.2f,购买数量:%d,总价:%d",$this->name,$this->price,$this->quantity,($this->quantity * $this->price));
  14. }
  15. }

实例化类并调用:

  1. $test2 = new Son("足球",88.8,10);
  2. echo $test2->calculator();//品名:足球,单价:88.80,购买数量:10,总价:888

四.trait

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制,可以理解为一个公共方法集,借用class语法实现了一个轻量级的类,但不是类,所以不能实例化,在要使用trait的类中,使用use关键字引用它就可以了

优先级:

1.当子类与父类存在同名成员时子类优先
2.当trait中存在与父类同名成员时,trait优先
例如:

  1. trait HelloWorld{
  2. public function sayHello(){
  3. echo "Hello World!";
  4. }
  5. }
  6. class TheWorldIsNotEnough{
  7. use HelloWorld;//引入trait
  8. //创建一个和trait中方法同名的方法:
  9. public function sayHello()
  10. {
  11. echo "Hello Galaxy!";
  12. }
  13. }
  14. $test3 = new TheWorldIsNotEnough();
  15. $test3->sayHello();//Hello Galaxy!

命名冲突时的解决方案:

如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as 操作符可以 为某个方法引入别名。 注意,as 操作符不会对方法进行重命名,也不会影响其方法。

例如,创建AB两个trait,并在里面创建两个同名方法:

  1. trait A{
  2. public function smallTalk(){
  3. echo 'a';
  4. }
  5. public function bigTalk(){
  6. echo "A";
  7. }
  8. }
  9. trait B{
  10. public function smallTalk(){
  11. echo 'b';
  12. }
  13. public function bigTalk(){
  14. echo "B";
  15. }
  16. }

在一个类中使用AB两个trait并解决冲突:

  1. class Aliased_Talker{
  2. use A,B{
  3. //用insteadof明确使用哪个:
  4. B::smallTalk insteadof A;
  5. A::bigTalk insteadof B;
  6. //用as给方法起个别名:
  7. B::bigTalk as talk;
  8. }
  9. }

实验解决冲突的成果:

  1. $test5 = new Aliased_Talker();
  2. $test5->bigTalk();//A
  3. $test5->talk();//B
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post