PHP面向对象精要总结


Posted in PHP onNovember 07, 2014

本文实例汇总了PHP面向对象程序设计的精要。分享给大家供大家参考。具体分析如下:

1 使用extends实现继承以及重载、魔术方法的含义

class B extends A
声明的时候B里可以没有A里的方法
调用的时候:

$b=new B();
$b->A里的方法();
$b->A里的属性=1;
$b->B里的方法();
$b->B里的方法();

如果$a=new A();
可以
$a->A里的方法();
$a->A里的属性=1;
不可以
$a->B里的方法();
$a->B里的方法();
 
重载:B继承A ,B里实现和A同名的方法属性。
PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。
 
魔术方法:PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以你定义自己的类方法时,不要以 __为前缀。
 
2 继承用private和protected访问修饰符可见性

属性方法private不可以被继承
属性方法protected类外部不可见,可以被继承
属性方法public 所定义的类成员可以在任何地方被访问

3 php中双冒号::的应用

php类代码中常看到"::"的操作符,这个是作用域限定操作符,是用一个双冒号"::"表示,它用来置顶类中不同作用域的级别。左边是作用域右边是访问作用域的成员。
在php中定义的作用域有self和parent两种(在php6中提供了static作用域)。
 
范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于子类覆盖父类中的成员和方法。

class MyClass {

    const CONST_VALUE = 'A constant value';

}
echo MyClass::CONST_VALUE;

class OtherClass extends MyClass

{

    public static $my_static = 'static var';
    public static function doubleColon() {

        echo parent::CONST_VALUE . "\n";

        echo self::$my_static . "\n";

    }

}
OtherClass::doubleColon();

//子类覆盖父类

class MyClass

{

    protected function myFunc() {

        echo "MyClass::myFunc()\n";

    }

}
class OtherClass extends MyClass

{

    // 覆盖父类中的方法

    public function myFunc()

    {

        // 但仍然可以调用已被覆盖的方法

        parent::myFunc();

        echo "OtherClass::myFunc()\n";

    }

}
$class = new OtherClass();

$class->myFunc();

4 php中this和self以及parent的作用

this:就是指向当前对象实例的指针,不指向任何其他对象或类。
self:表示当前类的作用域,与this不同的是它不表示类的某个特定实例,在类之外的代码中不能使用self,而且它不能识别自己在继承中层次的位置。也就是说,当在扩展类中使用self时,它调用的不是父类的方法,而是扩展类的重载的方法。self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。

private static $firstCount = 0;

private $lastCount;
//构造函数

function __construct()

{

     $this->lastCount = ++self:$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)

}

parent:表示当前类父类的作用域,其余的跟self特性一样。parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。
//继承类的构造函数

function __construct( $personSex, $personAge )

{

         parent::__construct( "test" ); //使用parent调用了父类的构造函数

         $this->personSex = $personSex;

          $this->personAge = $personAge;

}

5 构造函数与析构函数

具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
function __construct() {}
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
function __destruct() {}
 
6 final 关键字

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。
 
7 继承和构造函数

父类 子类 结果
有构造函数 无构造函数 父构造
有构造函数 有构造函数 子构造

 
8 接口

可以通过interface来定义一个接口,就像定义一个标准的类一样。
注意:
1)但其中定义所有的方法都是空的;
2)接口中定义的所有方法都必须是public,这是接口的特性;
3)实现多个接口时,接口中的方法不能有重名;
4)接口也可以继承,通过使用extends操作符;
5)接口中也可以定义常量。接口常量和类常量的使用完全相同。 它们都是定值,不能被子类或子接口修改。

// 声明一个'iTemplate'接口

interface iTemplate

{

    public function setVariable($name, $var);

    public function getHtml($template);

}

// 实现接口

// 下面的写法是正确的

class Template implements iTemplate

{

    private $vars = array();

  

    public function setVariable($name, $var)

    {

        $this->vars[$name] = $var;

    }

  

    public function getHtml($template)

    {

        foreach($this->vars as $name => $value) {

            $template = str_replace('{' . $name . '}', $value, $template);

        }

 

        return $template;

    }

}

9 属性

类的变量成员叫做“属性”,属性声明是由关键字public或者protected或者private开头,然后跟一个变量来组成。 属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶段运算出的常数。
在PHP5 中,预定义了两个函数“__get()”和“__set()”来获
取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。
简单的说一个是取值,一个是赋值。,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加://__get()方法用来获取私有属性

<?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;   

?>
<?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; 

?>

10 克隆

对象复制可以通过clone关键字来完成(如果对象中存在__clone()方法,会先被调用)。对象中的 __clone()方法不能直接调用。
当对象被复制后,PHP5会对对象的所有属性执行一个“浅复制”(shallow copy)。所有的属性中的引用 仍然不变,指向原来的变量。如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可用于修改属性的值(如果有必要的话)。

希望本文所述对大家的php面向对象程序设计有所帮助。

PHP 相关文章推荐
一周让你学会PHP 不错的学习资料
Feb 06 PHP
php 一元分词算法
Nov 30 PHP
drupal 代码实现URL重写
May 04 PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 PHP
一个PHP的ZIP压缩类分享
May 04 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
php使用cookie保存用户登录的用户名实例
Jan 26 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
May 12 PHP
php 类自动载入的方法
Jun 03 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
PHP使用feof()函数读文件的方法
Nov 07 #PHP
php几个预定义变量$_SERVER用法小结
Nov 07 #PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 #PHP
php中常见的sql攻击正则表达式汇总
Nov 06 #PHP
php中实现记住密码下次自动登录的例子
Nov 06 #PHP
php网站被挂木马后的修复方法总结
Nov 06 #PHP
调试PHP程序的多种方法介绍
Nov 06 #PHP
You might like
中东人咖啡哲学
2021/03/03 咖啡文化
php递归函数中使用return的注意事项
2014/01/17 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
Javascript - HTML的request类
2007/01/09 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
python分割一个文本为多个文本的方法
2019/07/22 Python
pandas如何处理缺失值
2019/07/31 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
副总经理工作职责
2013/11/28 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
经济管理自荐书
2014/06/09 职场文书
村级四风对照检查材料
2014/08/24 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis
Python正则表达式中flags参数的实例详解
2022/04/01 Python