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 相关文章推荐
杏林同学录(九)
Oct 09 PHP
截获网站title标签之家内容的例子
Oct 09 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 PHP
PHP 将图片按创建时间进行分类存储的实现代码
Jan 05 PHP
php&amp;mysql 日期操作小记
Feb 27 PHP
php简单判断文本编码的方法
Jul 30 PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 PHP
laravel学习笔记之模型事件的几种用法示例
Aug 15 PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 PHP
Laravel框架自定义验证过程实例分析
Feb 01 PHP
PHP微商城开源代码实例
Mar 27 PHP
PHP 对象继承原理与简单用法示例
Apr 21 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
PHP MySql增删改查的简单实例
2016/06/21 PHP
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
2017/02/28 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
Vue快速实现通用表单验证功能
2019/12/05 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
python操作xml文件详细介绍
2014/06/09 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
python中判断文件结束符的具体方法
2020/08/04 Python
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
机电一体化应届生求职信范文
2014/01/24 职场文书
办公室副主任职责范本
2014/03/08 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
学校捐书活动总结
2015/05/08 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle
mysql配置SSL证书登录的实现
2021/09/04 MySQL
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers
Go语言安装并操作redis的go-redis库
2022/04/14 Golang