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 执行系统外部命令 system() exec() passthru()
Aug 11 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
php获取url参数方法总结
Nov 13 PHP
PHP中mysqli_affected_rows作用行数返回值分析
Dec 26 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
php 使用array函数实现分页
Feb 13 PHP
微信公众平台实现获取用户OpenID的方法
Apr 15 PHP
PHP实现获取某个月份周次信息的方法
Aug 11 PHP
php+mysql实现简单登录注册修改密码网页
Nov 30 PHP
Laravel框架自定义验证过程实例分析
Feb 01 PHP
Laravel框架路由管理简单示例
May 07 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 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&amp;mysql(三)
2006/10/09 PHP
php 常用类整理
2009/12/23 PHP
PHP生成图片缩略图类示例
2017/01/12 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
PHP chr()函数讲解
2019/02/11 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
一些技巧性实用js代码小结
2009/10/14 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
Python自定义线程池实现方法分析
2018/02/07 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
python相对企业语言优势在哪
2020/06/12 Python
python利用platform模块获取系统信息
2020/10/09 Python
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
年终自我鉴定
2013/10/09 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
霸气队列口号
2014/06/18 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
单独二胎证明
2015/06/24 职场文书
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js