面向过程的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();
}
}
有如下两个文件
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();
}
}