PHP面向对象

本文详细介绍了PHP中的面向对象编程,包括类的定义、对象的创建、封装、构造方法和析构方法的使用,以及静态成员和方法。通过示例展示了如何通过getXxx()和setXxx()方法以及__get()和__set()魔术方法访问私有属性,以及如何使用构造方法初始化对象属性和析构方法释放资源。此外,还讨论了类常量、静态成员和方法的应用。

类的定义

类的定义语法格式:

class 类名{
成员属性;
成员方法;
}

定义一个类

<?php
class person {
    public $name;
    public $age;
    public function speak() {
        echo 'hello,everybody,my name is'.$this->name.'and i am'.$this->age.'now。<br>';
    }
}
?>

对象的创建

$对象名=new  类名 ([参数1,参数2...]);
  • new 表示创造一个新的对象
  • 对象创建成功,就可以通过 对象->成员 来访问类中的成员
  • 若不需要传递参数,可省略类名后面的括号
<?php
class person {
    public $name;
    public $age;
    public function speak() {
        echo 'hello,everybody,my name is '.$this->name.' and i am '.$this->age.' now。<br>';
    }
}
$p1=new person();
$p1->name="pipasound";
$p1->age="18";
$p1->speak();
?>
hello,everybody,my name is pipasound and i am 18 now。

类的封装

例如在为age赋值时,由于没有限制,因此可以赋予任何值,甚至一个负数。显然不合实际。
所以要为成员变量的访问做出一些限制,防止随意访问,即实现类的封装

用private将类的属性私有化

通过getXxx()和setXxx()方法访问私有属性

  • getXxx() 获取属性值
  • setXxx() 设置属性值
<?php
class Person {
    private $name;
    private $age;
    public function getName() {
        return $this->name;
    }
    public function setName($value)
    {
        $this->name=$value;
    }
    public function getAge() {
        return $this->age;
    }
    public function setAge($value) {
        if($value<0){
            echo '年龄不合法<br>';
        }else{
            $this->age=$value;
        }
    }
}
$p1=new Person();
$p1->setName("pipasound");
$p1->setAge("-18");
echo 'hello everybody,my name is '.$p1->getName().'<br>';
echo ' i am '.$p1->getAge().' now。';
?>
自动调用__set()方法为属性赋值
自动调用__set()方法为属性赋值
自动调用__get()方法获取属性值
hello everybody,my name is pipasound
自动调用__get()方法获取属性值
i am 18 now。

通过__get()和__set()方法访问私有属性

  • __get() 获取私有成员属性的属性值
  • __set() 为私有成员属性赋值
<?php
class Person {
    private $name;
    private $age;
    //定义__get()方法用于获取Person属性的值
    public function __get($property_name) 
    {
        echo '自动调用__get()方法获取属性值<br>';
        if(isset($this->$property_name)){
            return ($this->$property_name);
        }else{
            return(NULL);
        }
    }
    //定义__set()方法用于设置Person属性
    public function __set($property_name,$value)
    {
        echo '自动调用__set()方法为属性赋值<br>';
        $this->$property_name=$value;
    }
}
$p1=new Person();
$p1->name="pipasound";
$p1->age=18;
echo 'hello everybody,my name is '.$p1->name.'<br>';
echo ' i am '.$p1->age.' now。';
?>
  • public:公有修饰符,所有外部成员都可以访问这个类的成员
  • private:私有修饰符,外部代码无法访问
  • protected:保护成员修饰符,外部代码无法访问,但是该类的子类可以对其访问,读写

特殊的$this

$this->属性名
<?php
class person {
    public $name;
    public $age;
    public function speak() {
        echo 'hello,everybody,my name is '.$this->name.' and i am '.$this->age.' now。<br>';
    }
}
$p1=new person();
$p1->name="pipasound";
$p1->age="18";
$p1->speak();
$p2=new person();
$p2->name="hello";
$p2->age="19";
$p2->speak();
?>
hello,everybody,my name is pipasound and i am 18 now。
hello,everybody,my name is hello and i am 19 now。

构造方法

之前我们实例化一个类的对象后,才可以访问对象的属性。那我们想要在实例化对象的同时就为这个对象的属性赋值,需要通过构造方法来实现
语法格式:

修饰符 function __construct(参数列表){
 //初始化操作
}
<?php
 class Person{
     public $name;
     public $age;
     //声明一个构造方法,将来创建对象时,为对象的成员属性赋予初始值
     function __construct($name,$age){
         $this->name=$name;
         $this->age=$age;
     }
     function show() {
         echo $this->name.' is '.$this->age.' now.';
     }
 }
 $p1=new Person('pipasound',18);
 $p1->show();
?>
pipasound is 18 now.

析构方法

在对象销毁前会自动调用,用于释放内存

function__destruct() {
  //清理操作
}
<?php
 class Person{
     
    public function show() {
        echo '大家好,我Person类的对象<br>';
     }
     //声明析构方法,在对象销毁前自动调用
    function __destruct(){
         echo '对象被销毁';
     }
 }
 $p1=new Person();
 $p1->show();
?>
大家好,我Person类的对象
对象被销毁

类常量

常量的值不会改变。类常量在定义时需要用const关键字来声明

<?php
 class Person{
    const PI=3.1415926;
    public function show(){
        echo Person :: PI.'<br>';//通过类名访问
    }
    public function display(){
        echo self::PI.'<br>';//通过self关键字访问
    }
}
echo Person::PI.'<br>';//在内部直接访问
$p1=new Person();
$p1->show();
$p1->display();
?>

类中声明的常量PI是属于类本身而非对象。需要使用范围解析操作符(::)来连接类名和类常量来访问

静态成员

被static关键字修饰,不属于任何对象,只属于类

静态属性

当我们希望某些特定数据在内存中只有一份,并且可以被类的实例对象所共享,可以用静态属性

<?php
 class Student{
    public static $SchoolName="传智播客";
    public function show(){
        echo '我们的学校是:'.self::$SchoolName.'<br>';
    }
}
$p1=new Student();
$p1->show();
?>

静态方法

不创建对象就可以调用某个方法

<?php
 class Student{
    public static $SchoolName="传智播客";
    public static function show(){
        echo '我们的学校是:'.self::$SchoolName.'<br>';
    }
}
Student::show();
?>

在第三行定义一个静态属性schoolName,再定义了静态方法来输出学生所在学校的名称。在第八行代码通过‘类名::方法名’调用Student的静态方法,在静态方法中访问量静态属性$SchoolName.

  • 通常情况下静态方法用来操作静态属性
  • 在静态方法中,不要使用 t h i s 。 因 为 静 态 属 性 是 属 于 类 的 , this。因为静态属性是属于类的, thisthis则是指对象上下文。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值