面向对象并不是一种技术,而是一种思想,是一种解决问题的最基本的思维方式!如何理解使用?OOP:面向对象编程
(直接代码说明)
1.面向对象的基本概念 示例demo:
1 7 //如何定义类常量? 例如: const WORK = 'php'; 类常量 访问形式: 类名::常量名 8 //小结: 一个类中只有三个成员:1.属性(变量) 2.方法(函数) 3.类常量(常量) 9 class a{ //类10 public $name;//属性11 public $age;12 const WORK = 'php';//类常量13 public function user($object){ //方法14 echo '名字:'.$object->name.'年龄:'.$object->age.'工作'.self::WORK;//在一个类的内部,使用关键字self代替"当前类名"15 }16 }17 $newA = new a();//实例化对象 ==> class a{}18 $newA->name='admin_a';19 $newA->age = 100;20 $newA->user($newA);21 22 23 //如何使用$this? 例如: $this代表当前所属类的"当前对象" ,当前谁调用,谁就是"当前对象"24 //小结: 属性不能在方法内直接访问,需要先找到其对象才能访问,典型的做法就是在方法内使用$this关键字来代替当前对象.25 class b{26 public $name;27 public $age;28 const WORK = 'html';29 public function user(){30 echo '名字:'.$this->name.'年龄:'.$this->age.'工作'.self::WORK;//$this当前对象31 }32 }33 echo "";34 $newB = new b();35 $newB->name='admin_b';36 $newB->age = 200;37 $newB->user($newB);
运行结果如下图:
1 $this 和 self 的区别?2 3 一个是对象$this 相当于实例化后,可以说除了静态和const常量,基本上都可以使用this联络4 5 self则是类本身 self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时,可以不用实例化.
2.面向对象中的魔术方法,__construct():构造方法 示例demo
1 name=$user_name;11 $this->age=$user_age;12 }13 14 public function user(){15 echo '使用构造方法: 名字:'.$this->name.'年龄:'.$this->age.'工作:'.self::WORK;16 }17 }18 19 $userA= new a('admin_a',100);//对象的属性进行初始化20 $userA->user();21 22 $userB= new a('admin_b',200);//对象的属性进行初始化23 echo '';24 var_dump($userA,$userB);
运行结果如下图:
3.面向对象中的魔术方法,__destruct():析构方法 示例demo
1 name=$user_name;11 $this->age=$user_age;12 }13 14 public function __destruct(){ //析构方法15 echo ''.'销毁前自动调用:'.$this->name;16 }17 18 public function user(){19 echo '使用构造方法: 名字:'.$this->name.'年龄:'.$this->age.'工作:'.self::WORK;20 }21 }22 23 $userA= new a('admin_a',100);//对象的属性进行初始化24 $userA->user();25 $userA= NULL;26 27 $userB = new a('admin_b',200);28 echo '';29 var_dump($userA,$userB);
运行结果如下图:
4.面向对象中的魔术方法,__clone() 示例demo
1 name=$user_name; 8 $this->age=$user_age; 9 }10 11 public function __clone(){12 $this->name='admin_b';13 $this->age=200;14 }15 }16 17 $userA= new a('admin_a',100);18 $userB = clone $userA;//克隆新对象19 echo '';20 var_dump($userA,$userB);
运行结果如下图:
5.静态成员(包含静态属性和静态方法) 示例demo
类中的所有成员:1.非静态属性 2.静态属性 3.非静态方法 4.静态方法 5.类常量
1 name=$user_name;11 }12 13 public function user(){14 //静态属性访问 //常量访问15 echo '名字:'.$this->name.' (静态属性类内访问) 年龄:'.self::$age.' 工作:'.self::WORK;16 }17 }18 19 $userA= new a('admin_a');20 $userA->user();21 echo '(静态属性类外访问) 年龄:'.a::$age;22 23 24 //静态方法类内,类外如何访问?25 class b{26 public function f1(){27 echo '非静态方法f1()';28 }29 30 public static function f2(){31 echo '静态方法f2()';32 }33 34 public static function f3(){35 self::f2();36 }37 }38 echo '';39 $newB=new b();40 $newB->f1();41 echo '(静态方法类外访问) ';42 echo b::f2();43 echo '(静态方法类内访问)';44 echo b::f3();
运行结果如下图:
6. 类文件的自动 示例demo
1 user();
a.class.php文件
1 name=$user_name; 8 $this->age=$user_age; 9 }10 public function user(){11 echo '自动加载类文件获取: 名字:'.$this->name.'年龄:'.$this->age.'工作:'.self::WORK;12 }13 }
运行结果如下图:
7.类的继承 示例demo
1 goods_id=$goods_id;25 $this->goods_name=$goods_name;26 $this->type=$type;27 $this->area=$area;28 $this->author=$author;29 $this->title=$title;30 }31 }32 echo '';33 $manga =new manga('1000','书籍类','中国地区','漫画','米二','一人之下');34 print_r($manga);
运行结果如下图:
8.重写 示例demo
1 goods_name=$g_name;10 }11 public function getName(){12 echo $this->goods_name;13 }14 }15 16 class Book extends Goods{17 public $type;18 }19 20 class Manga extends Book{21 public $title;22 //先执行子类构造方法,后执行父类构造方法23 public function __construct($g_name,$m_title){24 //调用父类的构造方法并传递变量25 parent::__construct($g_name);26 $this->title=$m_title;27 }28 public function getName(){29 echo 'Goods父类:';30 //调用父类getName()方法31 Goods::getName();32 echo '
';33 echo 'Manga子类:';34 echo $this->title;35 }36 }37 38 $manga = new Manga('商品名称','一人之下');39 $manga->getName();
运行结果如下图:
9.最终类和抽象类 示例demo
1 ';17 print_r($book);18 19 //abstract类 示例demo20 abstract class goods{21 public $goods_id;22 public $goods_name;23 abstract function type($data);24 abstract function area();25 }26 27 class manga extends goods{28 public $author;29 public $title;30 function type($data){31 echo $data;32 }33 function area(){}34 }35 $manga= new manga();36 $manga->type('实现type()方法');
运行结果如下图:
10.interface接口 示例demo
1 discount;16 }17 }18 19 class Goods{20 private $price = 200;21 private $objectUser;22 //获取User接口VipUser类实现23 public function getUserData($User){24 $this->objectUser = $User;25 $discount = $this->objectUser->getDiscount();26 $usertype = User::VIP;27 echo $usertype."=>商品价格:".$this->price*$discount;28 }29 }30 31 $display = new Goods();32 $display ->getUserData(new VipUser);
运行结果如下图:
11.魔术方法和魔术常量概念小结
1 语法较多就不一一举例,更多信息可以去查php手册用法. 2 3 魔术方法 4 PHP中把以两个下划线__开头的方法称为魔术方法包括: 5 __construct() :类的构造函数 (常用) 6 7 __destruct() :类的析构函数 8 9 __call() :在对象中调用一个不可访问方法时调用10 11 __callStatic() :用静态方式中调用一个不可访问方法时调用12 13 __get() :获得一个类的成员变量时调用14 15 __set() :设置一个类的成员变量时调用16 17 __isset() :当对不可访问属性调用isset()或empty()时调用18 19 __unset() :当对不可访问属性调用unset()时被调用20 21 __sleep() :执行serialize()时,先会调用这个函数22 23 __wakeup() :执行unserialize()时,先会调用这个函数24 25 __toString() :类被当成字符串时的回应方法26 27 __invoke() :调用函数的方式调用一个对象时的回应方法28 29 __set_state() :调用var_export()导出类时,此静态方法会被调用30 31 __clone() :当对象复制完成时调用32 33 34 魔术常量35 魔术常量常被用于获得当前环境信息或者记录日志等.魔术常量包括:36 37 __LINE__ :文件中的当前行号38 39 __FILE__ :文件的完整路径和文件名40 41 __DIR__ :文件所在的目录42 43 __FUNCTION__ :函数名称44 45 __CLASS__ :类的名称46 47 __TRAIT__ :Trait的名字48 49 __METHOD__ :类的方法名50 51 __NAMESPACE__ :当前命名空间的名称
12.命名空间的概念和使用 示例demo:
1 ";18 19 //定义命名空间Two20 namespace Two;21 function getName(){22 echo '空间:'.__NAMESPACE__;23 }24 const AGE=200;25 class User{26 public $name='admin_b';27 }28 getName();29 echo '年龄:'.AGE;30 var_dump(new \Two\User);//注意:完全限定名称访问
运行结果如下图:
空间成员的访问 示例demo:
1 ";18 19 //(2)限定名称访问:就是从当前空间开始访问其子空间的成员. 语法:子空间名\空间成员名20 namespace A\B\C;21 function getName(){22 echo '空间:'.__NAMESPACE__;23 }24 const AGE=200;25 echo '空间A\B\C 非限定名称访问: ';26 getName();27 echo '年龄:'.AGE.'';28 29 echo '空间A\B\C 限定名称访问: ';30 D\getName();//限定名称访问31 echo '年龄:'.D\AGE;//限定名称访问32 var_dump(new D\User);//限定名称访问33 echo "
";34 35 //(3)完全限定名称访问:直接从根空间开始对绝对路径访问. 语法:\空间1\空间2\...\空间成员 36 //注意:完全限定名称访问的最大好处是可以在任意的空间访问其他任意空间的成员.37 //空间类的引入语法: use 空间名\类名38 namespace A;39 function getName(){40 echo '空间:'.__NAMESPACE__;41 }42 const AGE=300;43 echo '空间A 非限定名称访问: ';44 getName();45 echo '年龄:'.AGE.'';46 47 echo '空间A 完全限定名称访问: ';48 \A\B\C\D\getName();//完全限定名称访问49 echo '年龄:'.\A\B\C\D\AGE;//完全限定名称访问50 use A\B\C\D\User;//空间类的引入51 var_dump(new User);
运行结果如下图:
空间类的引入 示例demo:
文件One.php
1
文件Two.php
1 ';15 16 //将One空间里面Book类引入到当前空间17 use \One\Book;18 //将One空间里面User类引入到当前空间(注意使用别名:oneUser)19 use \One\User as oneUser;20 $oneBook= new Book();21 $oneUser= new oneUser();22 //使用当前空间类23 $twoUser= new User();24 var_dump($oneBook,$oneUser,$twoUser);
运行结果如下图: