`
957803796_1
  • 浏览: 124143 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

PHP面向对象精华

 
阅读更多

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 所定义的类成员可以在任何地方被访问

3php中双冒号::的应用

php类代码中常看到"::"的操作符,这个是作用域限定操作符,是用一个双冒号"::"表示,它用来置顶类中不同作用域的级别。左边是作用域右边是访问作用域的成员。

在php中定义的作用域有self和parent两种(在php6中提供了static作用域)。

范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员方法和常量,还可以用于子类覆盖父类中的成员和方法

classMyClass{
const
CONST_VALUE='Aconstantvalue';
}

echo
MyClass::CONST_VALUE;

classOtherClassextendsMyClass
{
publicstatic
$my_static='staticvar';

publicstaticfunction
doubleColon(){
echo
parent::CONST_VALUE."\n";
echo
self::$my_static."\n";
}
}

OtherClass::doubleColon();

//子类覆盖父类

classMyClass
{
protectedfunction
myFunc(){
echo
"MyClass::myFunc()\n";
}
}

class
OtherClassextendsMyClass
{
//覆盖父类中的方法
publicfunctionmyFunc()
{
//但仍然可以调用已被覆盖的方法
parent::myFunc();
echo
"OtherClass::myFunc()\n";
}
}

$class=newOtherClass();
$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'接口
interfaceiTemplate
{
publicfunction
setVariable($name,$var);
publicfunction
getHtml($template);
}

//实现接口
//下面的写法是正确的
classTemplateimplementsiTemplate
{
private$vars=array();

publicfunctionsetVariable($name,$var)
{
$this->vars[$name]=$var;
}

publicfunctiongetHtml($template)
{
foreach($this->varsas$name=>$value){
$template=str_replace('{'.$name.'}',$value,$template);
}

return$template;
}
}

9 属性
类的变量成员叫做“属性”,属性声明是由关键字public或者protected或者private开头,然后跟一个变量来组成。 属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶段运算出的常数。

在PHP5 中,预定义了两个函数“__get()”和“__set()”来获
取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。

简单的说一个是取值,一个是赋值。,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加://__get()方法用来获取私有属性

  1. <?php
  2. classPerson{
  3. //下面是人的成员属性
  4. private$name;//人的名字
  5. private$sex;//人的性别
  6. private$age;//人的年龄
  7. //__get()方法用来获取私有属性
  8. privatefunction__get($property_name){
  9. if(isset($this->$property_name)){
  10. return($this->$property_name);}else{
  11. return(NULL);
  12. }
  13. }
  14. }
  15. //__set()方法用来设置私有属性
  16. privatefunction__set($property_name,$value){
  17. $this->$property_name=$value;
  18. }
  19. //__isset()方法
  20. privatefunction__isset($nm){
  21. echo"isset()函数测定私有成员时,自动调用<br>";
  22. returnisset($this->$nm);
  23. }
  24. //__unset()方法
  25. privatefunction__unset($nm){
  26. echo"当在类外部使用unset()函数来删除私有成员时自动调用的<br>";
  27. unset($this->$nm);
  28. }
  29. }
  30. $p1=newPerson();
  31. $p1->name="thisisapersonname";
  32. //在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true
  33. echovar_dump(isset($p1->name))."<br>";
  34. echo$p1->name."<br>";
  35. //在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性
  36. unset($p1->name);
  37. //已经被删除了,所这行不会有输出
  38. echo$p1->name;
  39. ?>
  1. <?phpclassPerson{//下面是人的成员属性private$name;//人的名字private$sex;//人的性别private$age;//人的年龄//__get()方法用来获取私有属性privatefunction__get($property_name){if(isset($this->$property_name)){return($this->$property_name);}else
  2. {return(NULL);}}}//__set()方法用来设置私有属性privatefunction__set($property_name,$value){$this->$property_name=$value;}//__isset()方法privatefunction__isset($nm){echo"isset()函数测定私有成员时,自动调用<br>";returnisset($this->$nm);}//__unset()方法privatefunction
  3. __unset($nm){echo"当在类外部使用unset()函数来删除私有成员时自动调用的<br>";unset($this->$nm);}}$p1=newPerson();$p1->name="thisisapersonname";//在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为trueechovar_dump(isset($p1->name))."<br>";echo$p1->name."<br>";//在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性
  4. unset($p1->name);//已经被删除了,所这行不会有输出echo$p1->name;?>


10 克隆

对象复制可以通过clone关键字来完成(如果对象中存在__clone()方法,会先被调用)。对象中的 __clone()方法不能直接调用。

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

11 php的引用

就是在变量或者函数、对象等前面加上&符号


在PHP 中引用的意思是:不同的名字访问同一个变量内容.
与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址

变量的引用

PHP 的引用允许你用两个变量来指向同一个内容
[php]
<?
$a="ABC";
$b =&$a;
echo $a;//这里输出:ABC
echo $b;//这里输出:ABC
$b="EFG";
echo $a;//这里$a的值变为EFG 所以输出EFG
echo $b;//这里输出EFG
?>
[/php]

函数的传址调用
传址调用我就不多说了 下面直接给出代码
[php]
function test(&$a)
{
$a=$a+100;
}
$b=1;
echo $b;//输出1
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b;//输出101
[/php]
要注意的是,在这里test(1);的话就会出错,原因自己去想

函数的引用返回
先看代码
[php]
function &test()
{
static $b=0;//申明一个静态变量
$b=$b+1;
echo $b;
return $b;
}

$a=test();//这条语句会输出 $b的值 为1
$a=5;
$a=test();//这条语句会输出 $b的值 为2

$a=&test();//这条语句会输出 $b的值 为3
$a=5;
$a=test();//这条语句会输出 $b的值 为6
[/php]
下面解释下: 
通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定
PHP规定通过$a=&test(); 方式得到的才是函数的引用返回
至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂

用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
$a=&test();
$a=5;
以后,$b的值变为了5

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中

对象的引用
[php]
<?
class a{
var $abc="ABC";
}
$b=new a;
$c=$b;
echo $b->abc;//这里输出ABC
echo $c->abc;//这里输出ABC
$b->abc="DEF";
echo $c->abc;//这里输出DEF
?>
[/php]
以上代码是在PHP5中的运行效果
在PHP5中 对象的复制 是通过引用来实现的。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP定义了一个特殊的方法,称为__clone.

引用的作用
如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。


取消引用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

<?php
$a = 1;
$b =& $a;
unset ($a);
?>

不会 unset $b,只是 $a。


global 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

<?php
$var =& $GLOBALS["var"];
?>

这意味着,例如,unset $var 不会 unset 全局变量。

$this
在一个对象的方法中,$this 永远是调用它的对象的引用。


//下面再来个小插曲
php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲
1:如果有下面的代码
[php]
$a="ABC";
$b=$a;
[/php]
其实此时 $a与$b都是指向同一内存地址 而并不是$a与$b占用不同的内存

2:如果在上面的代码基础上再加上如下代码
[php]
$a="EFG";
[/php]
由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储
分享到:
评论

相关推荐

    php面向对象系列(完整)

    《PHP面向对象系列(完整)》是一份涵盖了2010年PHP面向对象编程的精华内容,主要包括了PHP 5.0中的多态性实现、PHP对象相关知识、PHP魔术函数等多个重要主题。以下是这些文档可能包含的关键知识点的详细解析: 1. **...

    PHP面向对象书籍精华片段

    ### PHP面向对象书籍精华片段解析 #### 一、面向对象的概念 面向对象编程(Object-Oriented Programming, OOP)是一种计算机编程范式,强调通过将数据和处理数据的方法捆绑在一起形成“对象”来构建软件。OOP的核心...

    PHP精华文摘 CHM

    8. **面向对象编程**:PHP5引入了完整的面向对象编程特性,如类、对象、继承、封装、多态性,以及魔术方法(__construct, __destruct等)。 9. **模板引擎与框架**:PHP常常与模板引擎(如Smarty)结合,提高代码的...

    PHP网络开发精华文摘

    6. **面向对象编程**:介绍PHP的类和对象概念,包括类的定义、属性和方法、继承、封装、多态等面向对象特性,以及如何利用SPL(标准扩展库)进行设计模式的实践。 7. **数据库交互**:详述了使用PHP连接和操作MySQL...

    PHP精华文摘

    6. **面向对象编程**:PHP5引入了完整的面向对象特性,包括类、对象、继承、封装、多态等概念,以及如何设计和实现面向对象的解决方案。 7. **PHP与Web服务**:介绍如何使用PHP构建RESTful API,以及与XML、JSON等...

    php高级开发教程 精华版

    首先,教程会深入讲解PHP面向对象编程(OOP)。这包括类与对象的概念,接口,抽象类,继承,封装,多态等核心概念,以及如何利用这些特性来构建可维护、可扩展的代码结构。 其次,将介绍PHP的常用框架,如Laravel、...

    PHP精华文摘(CHM) 最新版下载

    2. **面向对象编程**:讲解PHP的类、对象、继承、封装、多态等面向对象特性,以及如何创建和使用自定义类库。 3. **字符串与数组操作**:深入探讨PHP中的字符串处理函数(如substr、str_replace)和数组函数(如...

    PHP精华文摘集锦入门或进阶的首选

    3. **面向对象编程**:PHP5及以后版本引入了完整的面向对象特性,包括类、对象、继承、封装、多态等概念,这部分内容对于提升代码的可维护性和复用性至关重要。 4. **Web开发**:涵盖HTTP协议、表单处理、Cookie...

    PHP精华教程 php入门提高的经典教材

    - **面向对象编程**:PHP支持面向对象编程,包括类、对象、构造器等概念。 - **可伸缩性**:相比CGI,PHP在处理大量并发请求时有更好的性能,因为它可以被编译到Web服务器中,避免了CGI进程的频繁创建。 4. **PHP...

    PHP精华文摘(CHM)

    5. **类与对象**:介绍面向对象编程的基本概念,如类的定义、属性、方法、继承、封装、多态。 6. **错误与异常处理**:讲解错误类型、错误报告级别、try-catch语句的使用,以及自定义异常类。 7. **数据库交互**:...

    PHP精华

    在压缩包内的文件名"PHP精华文摘(CHM)"可能包含多个章节,每个章节都详细讲解了PHP的不同方面,例如基础语法、函数库、面向对象编程、错误处理、安全实践、性能优化、PHP与数据库交互、session和cookie的使用、PHP与...

    PHP精华教程

    - 面向对象编程:PHP支持类和对象,提供面向对象编程的特性,如构造器和析构函数,增强了代码的复用性和组织性。 - 可伸缩性:与CGI相比,PHP在处理大量并发请求时表现出更好的伸缩性,因为它通常以模块形式集成到...

    PHP精华文摘.rar

    类和对象是面向对象编程的基础,通过class关键字定义类,用`new`关键字创建对象,使用继承、封装和多态性实现复杂逻辑。 6. 错误与日志:PHP提供错误报告级别设置,如`error_reporting()`,以及错误处理函数如`...

    PHP精华文摘(CHM).rar

    此外,PHP支持面向对象编程,包括类、对象、继承、封装和多态。 3. **PHP与Web交互**:PHP常用于处理HTTP请求,解析表单数据,生成动态网页,以及与数据库交互。它能够通过$_GET和$_POST超级全局变量获取HTTP请求...

    PHP精华文摘(强烈推荐)

    6. **面向对象编程** - 类与对象:定义类、创建对象、属性和方法。 - 静态成员和常量:了解静态变量和静态方法的使用。 - 继承、封装和多态:理解OOP的三大特性及其应用。 7. **错误处理与异常** - 错误报告:...

    PHP 精华文摘 ----提供php初学者常见问题及解决

    文摘中的内容可能涵盖了基础语法、错误处理、函数应用、数据库交互、面向对象编程等多个方面,这对于想要深入理解PHP的人来说是极其宝贵的资源。 1. **PHP基础语法**:PHP是一种服务器端脚本语言,主要用于网页开发...

    PHP教程 精华文摘

    【PHP教程 精华文摘】 PHP,全称“Hypertext Preprocessor”,是一种广泛应用于Web开发的开源脚本语言。它嵌入在HTML中,使得开发者能够更灵活地处理动态网页内容。PHP的优势在于其语法简洁、学习曲线平缓,且与...

Global site tag (gtag.js) - Google Analytics