Php面向对象1

1.对象定义

class Person
{
    // 下面是人的成员属性
    var $name;  //人的名子
    var $sex;   //人的性别
    var $age;   //人的年龄
    // 下面是人的成员方法
    function say() // 这个人可以说话的方法
    {
        echo "这个人在说话";
    }
    function run() // 这个人可以走路的方法
    {
        echo "这个人在走路";
    }
}
?>

2.实例化对象

$p1=new Person();

3.调用方法和属性

从上例中可以看出只是对象里面的成员就要使用对象->属性对象->方法 形式访问,再没有第二种方法来访问对象中的成员了。

<?php
$p1 = new Person(); //创建实例对象$p1
$p2 = new Person(); //创建实例对象$p2
$p3 = new Person(); //创建实例对象$p3

// 下面三行是给$p1对象属性赋值
$p1->name = "张三";
$p1->sex = "男";
$p1->age = 20;

// 下面三行是访问$p1对象的属性
echo "p1对象的名子是:" . $p1->name;
echo "p1对象的性别是:" . $p1->sex;
echo "p1对象的年龄是:" . $p1->age;

// 下面两行访问$p1对象中的方法
$p1->say();
$p1->run();

// 下面三行是给$p2对象属性赋值
$p2->name = "李四";
$p2->sex = "女";
$p2->age = 30;

// 下面三行是访问$p2对象的属性
echo "p2对象的名子是:" . $p2->name;
echo "p2对象的性别是:" . $p2->sex;
echo "p2对象的年龄是:" . $p2->age;

// 下面两行访问$p2对象中的方法
$p2->say();
$p2->run();

// 下面三行是给$p3对象属性赋值
$p3->name="王五";
$p3->sex="男";
$p3->age=40;

// 下面三行是访问$p3对象的属性
echo "p3对象的名子是:" . $p3->name;
echo "p3对象的性别是:" . $p3->sex;
echo "p3对象的年龄是:" . $p3->age;

// 下面两行访问$p3对象中的方法
$p3->say();
$p3->run();
?>

4.$this

$this就是对象内部代表这个对象的引用

<?php
class Person
{
    // 下面是人的成员属性
    var $name; //人的名子
    var $sex; //人的性别
    var $age; //人的年龄

    // 下面是人的成员方法
    function say() // 这个人可以说话的方法
    {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
    }

    function run() // 这个人可以走路的方法
    {
        echo "这个人在走路";
    }
}

$p1 = new Person(); // 创建实例对象$p1
$p2 = new Person(); // 创建实例对象$p2
$p3 = new Person(); // 创建实例对象$p3

// 下面三行是给$p1对象属性赋值
$p1->name = "张三";
$p1->sex = "男";
$p1->age = 20;

// 下面访问$p1对象中的说话方法
$p1->say();

// 下面三行是给$p2对象属性赋值
$p2->name = "李四";
$p2->sex = "女";
$p2->age = 30;

// 下面访问$p2对象中的说话方法
$p2->say();

// 下面三行是给$p3对象属性赋值
$p3->name = "王五";
$p3->sex = "男";
$p3->age = 40;

// 下面访问$p3对象中的说话方法
$p3->say();
?>

5.造方法__construct()与析构方法__destruct()

格式:function __construct ( [参数] ) { ... ... }
在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。比如对成属性在创建对象的时候赋初值。

<?
// 创建一个人类
class Person
{
    // 下面是人的成员属性
    var $name;  // 人的名子
    var $sex;   // 人的性别
    var $age;   // 人的年龄

    // 定义一个构造方法参数为姓名$name、性别$sex和年龄$age
    function __construct($name, $sex, $age)
    {
        // 通过构造方法传进来的$name给成员属性$this->name赋初使值
        $this->name = $name;

        // 通过构造方法传进来的$sex给成员属性$this->sex赋初使值
        $this->sex = $sex;

        // 通过构造方法传进来的$age给成员属性$this->age赋初使值
        $this->age = $age;
    }

    // 这个人的说话方法
    function say()
    {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
    }
}

// 通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
$p1 = new Person("张三","男", 20);
$p2 = new Person("李四","女", 30);
$p3 = new Person("王五","男", 40);

// 下面访问$p1对象中的说话方法
$p1->say();

// 下面访问$p2对象中的说话方法
$p2->say();

// 下面访问$p3对象中的说话方法
$p3->say();
?>

析构函数是PHP5新添加的内容,在PHP4中没有析构函数。 析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件, 释放结果集等,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中被销毁前调用析构函数。与构造函数的名称类似, 一个类的析构函数名称必须是__destruct( )。析构函数不能带有任何参数。
格式:function __destruct ( ) { ... ... }

<?
// 创建一个人类
class Person
{
    // 下面是人的成员属性
    var $name;  // 人的名子
    var $sex;   // 人的性别
    var $age;   // 人的年龄

    // 定义一个构造方法参数为姓名$name、性别$sex和年龄$age
    function __construct($name, $sex, $age) 
    {
        // 通过构造方法传进来的$name给成员属性$this->name赋初使值
        $this->name = $name;
        
        // 通过构造方法传进来的$sex给成员属性$this->sex赋初使值
        $this->sex = $sex;
        
        // 通过构造方法传进来的$age给成员属性$this->age赋初使值
        $this->age = $age;
    }

    // 这个人的说话方法
    function say() 
    {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
    }

    // 这是一个析构函数,在对象销毁前调用
    function __destruct() 
    {
        echo "再见" . $this->name;
    }
}

// 通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
$p1 = new Person("张三", "男", 20);
$p2 = new Person("李四", "女", 30);
$p3 = new Person("王五", "男", 40);

// 下面访问$p1对象中的说话方法
$p1->say();

// 下面访问$p2对象中的说话方法
$p2->say();

// 下面访问$p3对象中的说话方法
$p3->say();
?>

6.var与public,protected,private的关系

private $age; // 把人的年龄使用private关键字进行封装
private function run(){……} // 把人的走路方法使用private关键字进行封装

<?php
class Person
{
    // 下面是人的成员属性
    private $name;      // 人的名子,被private封装上了
    private $sex;       // 人的性别, 被private封装上了
    private $age;       // 人的年龄, 被private封装上了

    // 这个人可以说话的方法
    function say()
    {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
    }

    // 这个人可以走路的方法, 被private封装上了
    private function run()
    {
        echo "这个人在走路";
    }
}

// 实例化一个人的实例对象
$p1 = new Person();

// 试图去给私有的属性赋值, 结果会发生错误
$p1->name = "张三";
$p1->sex = "男";
$p1->age = 20;

// 试图去打印私有的属性, 结果会发生错误
echo $p1->name;
echo $p1->sex;
echo $p1->age;

// 试图去打印私有的成员方法, 结果会发生错误
$p1->run();
?>

没有加任何访问控制,默认的是public的,任何地方都可以访问

<?php
class Person
{
    // 下面是人的成员属性
    private $name;  //人的名子,被private封装上了
    private $sex;   //人的性别, 被private封装上了
    private $age;   //人的年龄, 被private封装上了

    // 定义一个构造方法参数为私有的属性姓名$name、性别$sex和年龄$age进行赋值
    function __construct($name, $sex, $age)
    {
        // 通过构造方法传进来的$name给私有成员属性$this->name赋初使值
        $this->name = $name;

        // 通过构造方法传进来的$sex给私有成员属性$this->sex赋初使值
        $this->sex = $sex;

        // 通过构造方法传进来的$age给私有成员属性$this->age赋初使值
        $this->age = $age;
    }

    // 这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法
    function say()
    {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
    }
}

// 通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
$p1 = new Person("张三", "男", 20);
$p2 = new Person("李四", "女", 30);
$p3 = new Person("王五", "男", 40);

// 下面访问$p1对象中的说话方法
$p1->say();

// 下面访问$p2对象中的说话方法
$p2->say();

// 下面访问$p3对象中的说话方法
$p3->say();
?>

7.__set(),__get(),__isset(),__unset()四个方法的应用

对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性的”__isset()”和删除属性的方法”__unset()”。
__set()、__get()、__isset()、__unset() 这四个方法都是我们添加到对象里面的,在需要时自动调用的,来完成在对象外部对对象内部私有属性的操作。

<?php
class Person
{
    // 下面是人的成员属性, 都是封装的私有成员
    private $name;      //人的名子
    private $sex;       //人的性别
    private $age;       //人的年龄

    //__get()方法用来获取私有属性
    function __get($property_name)
    {
        echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br />";
        if (isset($this->$property_name))
        {
            return ($this->$property_name);
        }
        else
        {
            return NULL;
        }
    }

    //__set()方法用来设置私有属性
    function __set($property_name, $value)
    {
        echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br />";
        $this->$property_name = $value;
    }
}

$p1 = new Person();

// 直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值
$p1->name = "张三";
$p1->sex = "男";
$p1->age = 20;

// 直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值
echo "姓名:" . $p1->name . "<br />";
echo "性别:" . $p1->sex . "<br />";
echo "年龄:" . $p1->age . "<br />";
?>
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接获取私有属性值的时候,自动调用了这个__get()方法
姓名:张三
在直接获取私有属性值的时候,自动调用了这个__get()方法
性别:男
在直接获取私有属性值的时候,自动调用了这个__get()方法
年龄:20

__isset()
只要在类里面加上一个“__isset()”方法就可以了,当在类外部使用”isset()”函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的“__isset()”方法了帮我们完成这样的操作,“__isset()”方法也可以做成私有的。
_unset()方法:
那么如果在一个对象外部去删除对象内部的成员属性用“unset()”函数可不可以呢,也是分两种情况,如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性,如果对象的成员属性是私有的,我使用这个函数就没有权限去删除,但同样如果你在一个对象里面加上“__unset()”这个方法,就可以在对象的外部去删除对象的私有成员属性了。

<?php
class Person
{
    // 下面是人的成员属性
    private $name;      //人的名子
    private $sex;       //人的性别
    private $age;       //人的年龄

    // __get()方法用来获取私有属性
    private function __get($property_name)
    {
        if (isset($this->$property_name))
        {
            return ($this->$property_name);
        }
        else
        {
            return NULL;
        }
    }

    // __set()方法用来设置私有属性
    private function __set($property_name, $value)
    {
        $this->$property_name = $value;
    }

    // __isset()方法
    private function __isset($nm)
    {
        echo "isset()函数测定私有成员时,自动调用<br />";
        return isset($this->$nm);
    }

    //__unset()方法
    private function __unset($nm)
    {
        echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br />";
        unset($this->$nm);
    }
}

$p1 = new Person();
$p1->name = "this is a person name";

// 在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true
echo var_dump(isset($p1->name)) . "<br >";
echo $p1->name . "<br />";

// 在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性
unset($p1->name);

// 已经被删除了,所这行不会有输出
echo $p1->name;
?>

//output
isset()函数测定私有成员时,自动调用
boolean true
this is a person name
当在类外部使用unset()函数来删除私有成员时自动调用的
isset()函数测定私有成员时,自动调用

注意:
1、__set(), __get() 是专门为类的私有属性(private、protected)设立的,对于类的公开(public)属性,外面是可以直接访问与设置的(如:$p1->name),即不走__set(),__get()函数的!!!
2、在PHP5.3及以后,上述魔术方法(__get(),__set(),__isset(),__unset() 等)提倡是 public 类型的,并且不是 static 方法,否则会给出警告信息!

<?php
class A
{
    private $name = 'qianyunlai';
    public $old = '26';

    private function __get($name)
    {
        echo $name, '<br />';

        return $this->$name;
    }
}

$a = new A();
print_r($a->name);
?>

8.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 一个普通的类的示例: 类名的命名规范必须是字母或下划线开头,后面紧跟若干个字母、数字或下划线,类名最好能够表意,可...
    苏宇lovecc阅读 836评论 0 3
  • 一、数组 1、数组定义 数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西。 $...
    空谷悠阅读 805评论 4 11
  • 写在之前 因为简书字数限制,完整版地址:https://www.zybuluo.com/hainingwyx/no...
    hainingwyx阅读 13,881评论 0 41
  • 一、数组 1、数组的声明:$arr = array(); 2、数组的初始化:PHP有两种数组:索引数组、关联数组。...
    yzw12138阅读 1,197评论 2 2
  • 昨天在一电视节目上认识了一位小姐姐,她喜欢诗词,但现在却是一位工程师。很多人都不理解她为什么要弃文选工,她平静地说...
    听风的姑凉阅读 288评论 0 0