php的面相对象
-
1 <?php 2 3 4 class Hello 5 { 6 public function say_hello() 7 { 8 echo "hello"; 9 } 10 } 11 12 $say = new Hello(); 13 $say->say_hello();
先使用关键字class创建一个Hello类,在类里面写一个公开的方法say_hello().
在外部调用的时候直接用关键字new 接类名然后在用一个变量接收,这样就完成了一个类的实例化。接下来这个变量既可以使用这个类的方法。
- php的命名空间
- 当不同文件里有多个相同的类名的时候,这时候为了便于区分,php提供了一个命名空间的概念。
-
在index.php文件的同级目录下新建两个文件夹"first", "second".分别在里面新建两个相同名字的php文件,php文件的内容分别是:
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: HIAPAD 5 * Date: 2019/3/23 6 * Time: 9:39 7 */ 8 9 namespace first; 10 11 12 class Hello 13 { 14 public function sayhello(){ 15 echo "我是first里面的hello"; 16 } 17 }
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: HIAPAD 5 * Date: 2019/3/23 6 * Time: 9:40 7 */ 8 9 namespace second; 10 11 12 class Hello 13 { 14 public function sayhello(){ 15 echo "我是second里面的hello"; 16 } 17 }
可以看到,两个php文件里面的类名,类方法名字都是一样的,这个时候我们在引入的时候可能会出现冲突。php命名空间,也就是这里面的namespace,为我们解决了这个问题。接下来我们在index.php中来引入这两个文件
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: HIAPAD 5 * Date: 2019/3/23 6 * Time: 9:16 7 */ 8 9 require 'firstHello.php'; 10 require 'secondHello.php'; 11 12 $i = new firstHello(); 13 $i->sayhello(); 14 $i = new secondHello(); 15 $i->sayhello();
引入文件用的是require 后面接文件的相对路径的字符串形式。在类的实例化的时候,用namespace接该namespace下的类的名字来完成对应的类的实例化。
- 类的初始化
1 <?php 2 3 class Hello{ 4 public function __construct(){ 5 echo "hello"; 6 } 7 } 8 9 10 $i = new Hello();
php类的初始化方法__construct方法,会在类的对象被实例化的时候执行。
- 类的初始化传参
1 <?php 2 3 class Hello 4 { 5 public function __construct($name, $age) 6 { 7 $this->age = $age; 8 $this->name = $name; 9 } 10 11 public function getInfo() 12 { 13 return "这个人的名字是$this->name,他今年$this->age"."岁"; 14 } 15 } 16 17 $i = new Hello("bob",18); 18 echo $i->getInfo();
在类的__construct方法里面传入的参数可以用$this->params变量接收,在接下来类的方法里面可以调用$this->params变量来操作。__construct相当于python里面的__init__()方法,this相当于python里面的self。
- php的成员方法和类方法
1 <?php 2 3 class Hello 4 { 5 public function __construct($name, $age) 6 { 7 $this->age = $age; 8 $this->name = $name; 9 } 10 11 public function getInfo() 12 { 13 return "这个人的名字是$this->name,他今年$this->age"."岁"; 14 } 15 16 public static function getAge(){ 17 return "这是一个静态方法和类方法"; 18 } 19 } 20 echo Hello::getAge();
在类中创建方法的时候使用关键字static来创建一个静态方法和类方法。静态方法不会调用这个类里面的其他类属性和类方法。类方法可以直接被类本身调用,不用通过类的初始化对象来访问。访问方法:类名::方法名().
php 的public、private、protected的区别
- public 表示全局,类内部外部子类都可以访问;
- private表示私有的,只有本类内部可以使用;
- protected表示受保护的,只有本类或子类或父类中可以访问;