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
PHP4实际应用经验篇(4)
Oct 09 PHP
PHP连接access数据库
Mar 27 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
深入理解PHP中的Session和Cookie
Jun 21 PHP
使用dump函数,给php加断点测试
Jun 25 PHP
如何让thinkphp在模型中自动完成session赋值小教程
Sep 05 PHP
PHP连接和操作MySQL数据库基础教程
Sep 29 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
Feb 14 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
实例讲解PHP表单
Jun 10 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 计算两个特别大的整数实例代码
2018/05/07 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
js实现简易ATM功能
2020/10/27 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
python数组过滤实现方法
2015/07/27 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
PyQt5实现画布小程序
2020/05/30 Python
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
详解HTML5中的manifest缓存使用
2015/09/09 HTML / CSS
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
在C#中如何实现多态
2014/07/02 面试题
Ajax的优点和缺点
2014/11/21 面试题
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
三万活动总结
2014/04/28 职场文书
日语系毕业求职信
2014/07/27 职场文书
2015年三万活动总结
2015/03/25 职场文书
六年级作文之预言作文
2019/10/25 职场文书
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers