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)而不是数组模式访问。
另外需要注意的是,只能遍历公有对象,私有的,保护的是无法遍历的。
————————————————————————————————————————————————
重要声明:本博客所发内容均为本人原创。但有时为了防止一些小人网站盗版式的转载(无作者名,同时无原链接地址)所以,现在发贴常使用多次补充法。一次绝不发完。
凡是网上同标题,但只有部分内容者,均是盗版。比如,电脑编程网,目前就有此文的盗版转载。
此文本网站为首发原创,百度文库以及其它所有网站,均是侵权抄袭,特此声明!
分享到:
相关推荐
下面将详细介绍PHP面向对象编程中的一些关键概念和特性。 首先,PHP面向对象编程的基本构成单元是“类”。一个类可以包含属性(成员变量)和方法(成员函数),类的实例化对象可以拥有这些属性和方法。 在类的声明...
面向对象编程是PHP的一种核心特性,它允许程序员创建和使用类和对象,以此来组织和管理代码,提高可重用性和可维护性。在PHP中,面向对象编程涉及类的定义、属性、方法、访问修饰符以及特殊方法等概念。 在例一中,...
开源并非只是那些理想主义程序员们的专利,也不是那些想要在license上节省几十美元的公司所特有的。 平台支持性 从平台支持性方面来说,ASP.NET起初运行于IIS,现在也可以运行于Apache,而Apache能运行于所有平台...
- **PDO(PHP Data Object)** 提供了面向对象的方式来访问多种数据库。它支持SQL预编译,提供面向对象的接口以及更高效的数据库操作。使用PDO,可以这样写: ```php $conn = new PDO("mysql:host=localhost;dbname...
它会检查面向对象编程中的潜在安全问题,如不安全的内存管理、过度暴露的API等。 此外,“core_android.bin”专为Android应用开发设计,涵盖了Android特有的安全风险,如权限滥用、数据泄露等。而“extended_config...
(如果你是程序员,你会惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据...
而Java,作为另一款流行的面向对象的编程语言,其表白神器可能是一段精心设计的程序,它能够生成特定的图形、动画或者音乐,甚至结合数据库和网络功能,让表白更加生动和个性化。比如,可以创建一个简单的Java应用,...
3. **E4A**:Easy4App(E4A)是一种面向对象的编程语言,主要用于快速开发Android应用。它简化了Java的语法,让非专业程序员也能进行应用开发。在安琪直播盒子中,E4A可能被用来加速Android应用的开发过程,降低开发...
程序员通常会结合Java、C++、PHP、JSP或.NET等面向对象的编程语言来构建GUI,并利用SQL来处理与数据库的交互。值得注意的是,不同的数据库管理系统可能会有自己的SQL方言,比如MySQL特有的`LIMIT`关键字在SQL Server...