`
bardo
  • 浏览: 379395 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11831
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10141
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9529
社区版块
存档分类
最新评论

PHP程序员必须掌握的PHP面向对象的特有的特性

    博客分类:
  • PHP
阅读更多

PHP程序员必须掌握的PHP面向对象的特有的特性,这些都是其它编程语言所没有的:

 

伪重载

重载,就是指有同名函数。当然,重载是有条件的。通常条件是:参数类型不同。(这一点PHP是做不到的,因为PHP是弱类型语言)第二类条件则是,参数个数不同。
PHP4的类中不允许有同名成员函数。也就是说不可以重载。
当然,我们可以对参数个数不同的全放入同一函数中。以默认值方式设置后面的参数。根据后面参数是否传入,分别处理。
但也可以通过以下方式,实现伪重载。
为什么使用此方法?(修改次数与修改的位置数。)
function otest1 ($a) { echo( '一个参数' ); }
function otest2 ( $a, $b) { echo( '二个参数' ); }
function otest3 ( $a ,$b,$c) { echo( '三个啦' ); }
function otest () {
$args = func_get_args();
$num = func_num_args();
call_user_func_array( 'otest'.$num, $args ); }
otest(1,2);

动态继承

虽然PHP对设计模式支持不够,但是,作为动态语言,PHP可以实现动态继承。而动态继承即是指子类动态选择父类。这与设计模式中的类工厂,工厂方法或抽象工厂要实现的目标是一致的。
下例即是动态继承的实现方法实例。

$databaseSystem = "mysql";
class mysql{
   function show()   {
       print("bar");
   }
}
eval('class intermediate extends ' . $databaseSystem . ' {}');
class ActiveRecord extends intermediate{
   function ActiveRecord()   {
       print("foo");
   }
}
$instance = new ActiveRecord;
$instance->show();

与对象相关的函数

get_class_methods — 返回由类的方法名组成的数组
get_class_vars — 返回由类的默认属性组成的数组,利用这两个函数,可以方便地为程序生成文档。
get_class — 返回对象的类名,不管是在父类中还是子类中,返回的都是当前创建的子类的类名。
get_object_vars — 返回由对象属性组成的关联数组。ORM映射时,常用此将对象转为数组。
get_parent_class — 返回对象或类的父类名
property_exists — 检查对象或类是否具有该属性,强制属性声明时,就是用的此函数。
method_exists — 检查类的方法是否存在,利用这一方法可以预留函数让用户扩展。但这一方法不太安全。即如果是非经过验证的操作,将会导致安全问题。所以,较烦琐的方法则是可以将预留的方法定义出来,让用户在扩展类扩展。

对象比较

在 PHP 中,对象比较的规则十分简单:如果两个对象的类相同,且它们有相同的属性和值,则这两个对象相等。类似的规则还适用与用全等符(===)对两个对象的比较。
这就是说,不管对象名,只要是类相同(与变量的类型相同一样),属性与值也相同(与数组比较类似),则这两个对象相等

属性(字段或称为成员变量)运行时动态添加

php对象中的属性不必显式声明,所以,可以动态添加。并且,默认情况下,不存在的属性均是Public的。所以,你大可以直接$obj->newPropertyName=$value。

方法(或称为成员函数)运行时动态添加

php5.3以前,无闭包支持,所以,只能用runkit扩展进行动态添加,而php5.3可以用闭包方式进行动态添加。

魔术函数

魔术函数是PHP对象特有的。这些函数为PHP对象提供了强大的功能。比如:
__get, __set 实现了对属性的访问控制。当需要有效性控制时,你不需要写对应的get属性名,set属性名这样的函数,只要将代码写到这两个魔术函数中即可。
__call 当方法不存在时,会调用此函数。这就给扩展提供了方便。所以,你大可以在类外面写一个函数,__call中用代码调用类外面的这个函数。从而实现了与调用类的方法相同的接口。
__isset __unset 如果你要自定义检查对象中的属性是否初始化,或释放这个属性,可以这两个方法中添加代码。
__toString  对象的toString是固有的,如果你要重载,可以在这个函数中添加代码。

软编码

php对软编码有良好的支持,特别是面向对象,类的名称,方法,属性均可以使用变量来调用。比如:

$obj=new $className()

$obj->$propertyName=true;

$result=$obj->$mothodName();

属性遍历

php帮助文档中说,要遍历属性,需要实现Iterator这个接口。实际上,这里所说的是用数据模式访问。不实现这个接口一样可以遍历。请看下面的代码,如果运行一下,你就更能明白其中的奥妙了。

class test{
 public
  $name,
  $age,
  $gender,
  $education,
  $hometown; 
 function __construct(){} 
}
$obj=new test();
$person=array( 
  'name'=>'Jhon',
  'age'=>25,
  'gender'=>'male',
  'education'=>'master',
  'hometown'=>'New York'
  );
foreach($obj as $key => $value){

 echo $key,'<br>';
  $obj->$key=$person[$key];
}
var_dump($obj);

可以看出,最大的区别,是结果仍是对象式访问,只能用($obj->$key)而不是数组模式访问。

另外需要注意的是,只能遍历公有对象,私有的,保护的是无法遍历的。

 ————————————————————————————————————————————————

重要声明:本博客所发内容均为本人原创。但有时为了防止一些小人网站盗版式的转载(无作者名,同时无原链接地址)所以,现在发贴常使用多次补充法。一次绝不发完。

凡是网上同标题,但只有部分内容者,均是盗版。比如,电脑编程网,目前就有此文的盗版转载。

 

此文本网站为首发原创,百度文库以及其它所有网站,均是侵权抄袭,特此声明!

 

0
0
分享到:
评论

相关推荐

    PHP面向对象概念

    下面将详细介绍PHP面向对象编程中的一些关键概念和特性。 首先,PHP面向对象编程的基本构成单元是“类”。一个类可以包含属性(成员变量)和方法(成员函数),类的实例化对象可以拥有这些属性和方法。 在类的声明...

    PHP 高级课程笔记 面向对象

    面向对象编程是PHP的一种核心特性,它允许程序员创建和使用类和对象,以此来组织和管理代码,提高可重用性和可维护性。在PHP中,面向对象编程涉及类的定义、属性、方法、访问修饰符以及特殊方法等概念。 在例一中,...

    PHP与ASP.NET优劣势分析.pdf

    开源并非只是那些理想主义程序员们的专利,也不是那些想要在license上节省几十美元的公司所特有的。 平台支持性 从平台支持性方面来说,ASP.NET起初运行于IIS,现在也可以运行于Apache,而Apache能运行于所有平台...

    PHP5各个版本的新功能和新特性总结

    - **PDO(PHP Data Object)** 提供了面向对象的方式来访问多种数据库。它支持SQL预编译,提供面向对象的接口以及更高效的数据库操作。使用PDO,可以这样写: ```php $conn = new PDO("mysql:host=localhost;dbname...

    20200817rules.7z

    它会检查面向对象编程中的潜在安全问题,如不安全的内存管理、过度暴露的API等。 此外,“core_android.bin”专为Android应用开发设计,涵盖了Android特有的安全风险,如权限滥用、数据泄露等。而“extended_config...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    (如果你是程序员,你会惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据...

    今天你说520了吗?不仅有php表白书还有java表白神器

    而Java,作为另一款流行的面向对象的编程语言,其表白神器可能是一段精心设计的程序,它能够生成特定的图形、动画或者音乐,甚至结合数据库和网络功能,让表白更加生动和个性化。比如,可以创建一个简单的Java应用,...

    安琪直播盒子源码

    3. **E4A**:Easy4App(E4A)是一种面向对象的编程语言,主要用于快速开发Android应用。它简化了Java的语法,让非专业程序员也能进行应用开发。在安琪直播盒子中,E4A可能被用来加速Android应用的开发过程,降低开发...

    MySQL基础与实例教程练习题参考答案.doc.doc

    程序员通常会结合Java、C++、PHP、JSP或.NET等面向对象的编程语言来构建GUI,并利用SQL来处理与数据库的交互。值得注意的是,不同的数据库管理系统可能会有自己的SQL方言,比如MySQL特有的`LIMIT`关键字在SQL Server...

Global site tag (gtag.js) - Google Analytics