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效率,提高php性能的一些方法
Mar 24 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
Jul 03 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
typecho插件编写教程(三):保存配置
May 28 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
在Laravel中实现使用AJAX动态刷新部分页面
Oct 15 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
range 标准化之获取
2011/08/28 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
详解Python pygame安装过程笔记
2017/06/05 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
python中几种自动微分库解析
2019/08/29 Python
Python 获取项目根路径的代码
2019/09/27 Python
Django models filter筛选条件详解
2020/03/16 Python
降低python版本的操作方法
2020/09/11 Python
python链表类中获取元素实例方法
2021/02/23 Python
美国最大的团购网站:Groupon
2016/07/23 全球购物
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
房屋出售协议书
2014/04/10 职场文书
答谢会策划方案
2014/05/12 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
副总经理岗位职责
2015/02/02 职场文书
会计做账心得体会
2016/01/22 职场文书
学生检讨书范文
2019/06/24 职场文书