PHP笔记之构造方法、魔术方法

本篇主要记录类的创建,下面是创建类,声明变量,方法的基本形式

注意

$this 对象内部方法中代表本对象的一个引用,但只能在对象的成员方法中使用,不管是在对象内部使用$this访问自己对象内部成员,还是在对象外部通过对象的引用名称访问对象中的成员,都需要使用特殊的运算符“->”来完成访问。

class BoyFriend{
        //声明变量(成员属性)
        var $name ;//基本不使用var
        var $age;
        var $sex;
        var $height;

        //成员方法
              
        public function fuck(){
            echo $this -> name."fuckU";
        }
    }

类的初始化

//两种形式都可以
$bf1 = new BoyFriend();
$bf2= new BoyFriend;
//赋值
$bf1 -> name = "jack";
$bf1.name 此种形式虽然能显示出来,但是是错误的,因为此处的.是连接,而不是类似于OC的点语法

构造函数

1.是对象创建完成以后,第一个自动调用的方法
2.方法名比较特殊,可以和类名相同名的方法名
3.给对象中的成员赋值
4.构造方法的魔术方法__construct;相当于OC的便利构造器

// function __construct()与下面等同,目前主要用此形式
function BoyFriend($name,$age,$sex){
            $this->name = $name;
            $this->age = $age;
            $this->sex = $sex;
            echo $this->name.$this->age.$this->sex.'
'; } //初始化并赋值 $bf1 = new BoyFriend("wp",23,"男"); $bf2 = new BoyFriend("sb",30,"女");

析构函数

类似于OC中的dealloc,但原理机制不同,和Java垃圾回收差不多,PHP的垃圾回收,但并不常用
__destruct 对象回收之前自动调用,析构函数没有参数,无返回值

function __destruct(){
      echo "###{$this->name}再见!
";//此处先释放bf2,再释放bf1,栈先进后出 }

封装

在属性或方法前添加修饰词private、public、protect等,下面着重强调访问私有变量的一些方法。
当成员变量为私有时,不可直接访问

class BoyFriend{
//声明变量(成员属性)
private $name ;
private $age;
private $sex;   
           
//私有变量赋值
function setSex($sex){
//对象本身还是可以获取自己的变量;
    $this -> sex = $sex;
}
function setAge($age){
  $this -> age = $age;
}
//私有对象取值
 function getAge(){
//通过判断这一过程,重新赋值
        if ($this->age<20) {
            return $this->age;
        }else{
            return "whatTheHell";
        }
}
//getSex 与上类似不写了

//在构造函数中使用set方法赋值
function __construct($name,$age,$sex){
        $this -> sex = $this->setSex($sex);
            $this -> age = $this->setAge($age);
}
}

//获取值
$bf1 = new BoyFriend("wp",28,"男");
echo $bf1 -> getAge();
echo $bf1 -> getSex();

其实这一部分就相当于OC中的setter、getter方法,接下来是两个相关的魔术方法,会大大缩减所需写的方法

魔术方法

__get();
自动调用:是在直接访问私有成员时,自动调用

   class BoyFriend{
                private $age;
        private $sex;
          function __get($pro){
            //自动调用私有属性,传进来私有属性名称
            return $this->$pro.'
'; } } //直接读取私有属性会自动调用__get() echo $bf1->sex.'
'; echo $bf2->age.'
';

__set();
自动调用,是在设置属性值时自动调用, 赋值时自动获取私有变量名称及值

class BoyFriend{
                private $age;
        private $sex;
                function __set($name,$value){
            echo "{$name}=={$value}
"; $this->$name = $value; } } $bf1->age = 111; $bf1->sex = "非洲人";

接下来两个魔术函数,并不常用,了解即可
isset()判断变量是否存在,unset()消除某个变量,这在变量是非私有性质的时候是可以的,但是当变量是私有的时候,需要用到__isset()和__unset()结合使用才能访问私有变量。

class BoyFriend{
        //变量(成员属性)
        private $name ;
        private $age;
        private $sex;
        function __construct($name,$age,$sex){
            $this->name = $name;
            $this->age = $age;
            $this->sex = $sex;
        }
        //在isset()判断私有变量时,自动调用__isset();同时获取私有变量名称
        function __isset($proname){
                echo $proname.'
'; // return isset($this->$proname); } function __unset($proname){ echo $proname.'
'; if ($proname!="age") { unset($this->$proname); } } } $bf1 = new BoyFriend("wp",28,"男"); if (isset($bf1->name)) { echo "存在name"; }else{ echo "不存在"; } //删除 unset($bf1->name);

__toString
1.是在直接使用echo print printf输出一个对象引用时,自动调用这个方法
2.将对象的基本信息放在__toString()方法内部,形成字符串返回。
3.__toString()方法中,不能有参数,而且必须返回一个字符串

克隆对象
1.使用clone这个关键字 复制了一个对象

$p = new Person();
$p1 = clone $p ;

__clone()魔术方法
1.是在克隆对象时,自动调用的方法
2.作用:和构造方法一样,是对新克隆的对象初始化
3.在这个方法中$this代表的是副本,所以可以给所有副本的成员初始化

function__clone(){
  $this->name = "123";
  $this->age = 9;
}

__call()
1.就是在调用一个对象中不存在的方法时,自动调用的方法
2.有两个参数,第一个参数是,调用不存在的方法名,第二个是参数
3.可以写提示,但不是主要功能。将方法的功能相似,但方法名还要不同的,可以采取这个方式

你可能感兴趣的:(PHP笔记之构造方法、魔术方法)