php面向对象和面向过程

来源:互联网 发布:预谋邂逅知乎 编辑:程序博客网 时间:2024/06/05 15:50
面向过程的PHP
有如下两个文件
test1.php
<?php
     function aa(){
     echo 'haha';
      }
     $b = 1;
?>
test2.php
<?php
       include 'test1.php';
      function aa(){
      echo 'lala';
      }
      function bb(){
       global $b;
       $b = $b + 1;
       }
      aa();
      bb();
      echo $b;
}
文件2和文件1中存在同名函数,此刻会立即报错,不容许这样的复用情况出现,而且,对于全局变量$b,在文件2中其值改变,发生全局变量的污染,造成不可预知的麻烦,这就是面向过程的弊端。于是采用面向对象的方法来解决这个问题,将变量和方法进行封装,(js中是没有类class的,而php有)有三种形式来表现:
1.成员变量  成员方法(动态 ,静态),说说动态的。
class Person{
 public static $name = 1;
 public static function index(){
 echo '123';
 }
}
echo Person::$name;
Person::index();
}
2.构造函数  析构函数  (想到当给内部的成员方法传参的时候。。。污染全局变量)
class Person{
   public $x;
   public $y;
   public function__construct($x,$y){//初始化变量
            $this->x= $x;
           $this->y = $y;
    }
    public function index(){
    $k = $this->x + 1;
    echo $k;
    }
}
$per = new Person(5,1);
$per->index();
继承
class pupil{
       public function __construct(){
                parent::__construct();//这时候的parent 相当于Person,调用父类的构造函数
       }
}
$per = new Person();
$per->index();
单独仅仅执行如上代码,会报错,找不到父类,故应该有如下形式:
class pupil extend Person{


}
所以
class pupil extend Person{
       public function __construct(){
                parent::__construct();//这时候的parent 相当于Person,调用父类的构造函数
       }
}


3.PHP在类封装中提供了三个访问控制符号 public private protected
public 表全局  可以在本类 、类外部(如实例化的时候)、 子类中使用
protected 表示受保护 可以在本类、子类中调用
private 表示私有 只能在本类中调用
class Person{
   public $name;
   protected $age;
   private $salary;
   public function __construct($name ,$age , $salary){
         $this->name = $name;
         $this->age = $age;
         $this->salary = $salary;
    }
    public function showinfo(){
          echo $this->name."||".$this->age."||".$this->salary;
    }
}
 $p = new Person('sword',10 , 30)
echo $p->name;
echo $p->age;//无法输出
echo $p->salary;;//无法输出


如果要想访问age and salary,PHP提供了魔术方法:
class Person{
     private $n1;
     private $n2;
      public function __set($name,$value);//通过使用__set方法设置管理属性
      {
             $this->name = $value;
      }
      public function __get()
      {
             if(isset($name)){
                    return $this->name;
              }else{
                   return null;
              }
      }
}
$q = new Person();
$q->n1 = 'hello';
echo $q->n1;
////////////////正常情况下,如同java中的get and set方法一样,但是
public function set($value){
    $this->n1 = $value;
}
public function get(){
     return  $this->n1;
}
$p = new Person();
$a->set('helllo');
echo $a->get();
php中的魔术方法就有那么几种而已。


            


面向对象的继承
(1)子类最多只能继承一个父类(直接继承)
(2)子类可以继承其父类的public protected的成员变量和成员方法
(3)parent::__construct()在子类中的构造函数里面必须写
(4)如果子类中需要访问父类中的public protected的方法 采用父类名::父类的成员方法
(5)如果子类中方法和父类的方法相同,称为方法重写
classs A{
  public function aa(){
}
}
class B extends A{
   public function __construct(){


   }
   public function bb(){
     A::aa();
   }
}
       
0 0
原创粉丝点击