0

0

php的类和对象(翻译:midiguy)

php中文网

php中文网

发布时间:2016-06-21 09:11:59

|

1189人浏览过

|

来源于php中文网

原创

对象

/**********************************************************
翻译:midiguy
翻译错误之处还请各位指出
E-Mail:midiguy@263.net
QQ:5149927
***********************************************************/

面向对象程序设计的来源得自于人们看待电话、汽车这些物体的想法。很多程序设计者在讨论面向对象程序设计的时候喜欢用“包装”或者“继承”这些让一般人迷惑不解的词语。我们可以把面向对象这个概念和自然物体联系起来去理解它的原理。让我们拿交通工具来做个比方。

设计图

为了构建交通工具我们需要一份设计图。这份设计图可以定义交通工具的车轮的数量、颜色等等。一种交通工具通过一定的属性和行为来定义。在PHP中这些属性和行为就叫做变量和方法(函数)。描述一个对象的一组变量和方法就构成了一个“类”。

扩展的设计图

因为有各种不同类型的交通工具,比如汽车、自行车和摩托车。我们需要一种方法,它可以让我们为各种交通工具增加新功能的同时也可以使用交通工具的一般性的方法,换句话说,因为“履带”要用在所有类型的交通工具上面,我们不需要再重新编写这种方法。我们能够“继承”来完成这个功能。假如我们创建一个从“交通工具”继承过来的“汽车”的类,所有在“交通工具”类中的方法将被“汽车”类继承。

抽象

抽象的目的只关注于一个复杂对象的部分性质,为了解决你的问题需要你去构建一个考究的对象。你可以很容易的得到一辆汽车成千上万的属性,但是如果你需要设计一个程序去保存一个汽车经销商的目录,那么你应该只需要一个包含10多个属性的子集。这样一辆汽车被抽象成一个适合编程使用的汽车对象.

包装

包装可以隐藏一组方法的内容工具机制而只提供给用户一个定义良好的借口。在面向对象程序编程中,包装使得对象的数据结构和方法组合在一起。最容易理解“包装”的方式可以参考电话机。当今消费者可以购买各式各样的电话机,虽然这些电话机的内部设计方法可能不同,但是所有这些电话机器都能够通过一个标准的公共接口通讯。这就是包装的思想.

一个类可以定义新数据类型。PHP本身具有变量类型,比如字符串变量和浮点类型变量。但是通过类你可以设计自己的数据类型比如船、用户参考手册和数据库等等。一个类定义这种数据类型的属性和行为(成员变量和方法)。下面的例子显示如何定义一个包含属性和方法的类。

让我们看一下我们的交通工具的实际的例子

/*
** 如何定义一个类
*/

class Class_Name
{
[var 变量定义]
[Function 方法定义]
}

?>
----------交通工具类------------

class vehicle
{
/*
** 属性
*/
var $property1;
var $property2;
var $property3;

/*
** 方法
*/
function setTires($type)
{
if ($type == \"Firestone\")
{
$this->property1 = \"Must be a Ford SUV\";
}
}

function color($col)
{
$this->property2 = $col;
}
}

?>  

如何使用定义好的类

类定义好以后,我们就可以建立它的实例。为了使用刚才的例子,我们在下面创建一个“交通工具”类的实例。


$myCar = new vehicle();
$myCar->setTires(\"Firestone\");

?>


使用类中的变量

最大的不同点在于使用一个对象和对象拥有的值的种类。一个字符串变量倒是很容易理解,因为它拥有一个值。
$myStr = \"PHP stands for... uh.. i forget\";

然而一个对象可以拥有任何种类的值
$myCar->year = 1988;
$myCar->value = 813.77;
$myCar->hasAirbag = false;
$myCar->color = \"periwinkle\";

在PHP中,一个对象的所有成员变量默认是公有的。没有办法可以强迫一个对象的访问属性,但是如果希望一个变量是私有变量的话,我们可以用一种强调的方式来实现。

$this pointer
如果你想调用一个对象的方法,你可以使用 \'$this\'来调用此对象指定实例的成员变量。刚开始,你可能对这个有点不理解,让我们来看个例子。首先,假设你有两辆汽车。

$myCar = new vehicle();
$spousesCar = new vehicle();

现在你有了同一个类的两个对象。你可能也听过这样的说法,“现在你有了同一个用户定义变量类型的两个综合变量”。 These are just different ways of talking about the same OOP concepts.
每个变量,$myCar 和 $spousesCar, 拥有这个类的独立的一套属性。

$myCar->property1;
//这两个是不同的
$spousesCar->property1;

//即使property1只在类定义中出现一次。你必须清楚,它仅仅是为了构成一个新数据类型而设计的。
但是在这个类内只有一个setTires()函数。当我们使用下面的语句的时候,它如何了解是谁调用了它呢?

$myCar->setTires(\"Firestone\");

呵呵,现在这个$this就起作用了。在一个指定对象调用类内部的函数时候,这个对象就自动作为一个参数传递。用$this是出于方便的需要。看看下面的例子你应该可以理解。

$myCar->setTires(\"Firestone\");

/*
** 方法
*/
function setTires($type)
{
if ($type == \"Firestone\")
{
$this->property1 = \"Must be a Ford SUV\";
}
}
//$this 代表 $myCar 变量

$spousesCar->setTires(\"Goodyear\");

/*
** 方法
*/
function setTires($type)
{
if ($type == \"Firestone\")
{
$this->property1 = \"Must be a Ford SUV\";
}
}
//现在它就代表 $spousesCar.

创建一个构造器

在一个类的实例被创建以后,如果开发者希望能有一个“默认”的函数可以调用,该怎么办呢?这就是要用到“构造器”
其实你只需要简单的将构造器的名字定义为类的名字就可以实现。现在你每次创建这个类的对象的时候,这个构造器方法将被调用。

类的继承

我们以前说过,一个类可以继承另一个类;但是我们如何利用这种功能呢?在一个系统中,许多变量起相同的作用,仅仅一些的作用有些不同,继承是非常有用的。继承是一种方法,通过这种方法,一个类可以用另外一个类作为模板来建立自身。继承类将把在被继承类中定义的成员变量和方法继承过来。通过延伸或者继承过来的类叫做子类。被继承类的叫做超类或父类。这样可以使类之间的作用不同并且不会影响现存的代码.现在让我们看个例子。

class Airplane {
var $tirePressure;
var $fuelLevel;
var $passengerLimit;

function takeOff() {
...
}

function land() {
...
}

function preFlightCheck() {}
}

class sevenFortySeven extends Airplane {

function preFlightCheck() {
//747飞机起飞预备工作
}
}

class biplane extends Airplane {

function preFlightCheck() {
//双翼飞机起飞预备工作
}
}


$planeArray[] = new biplane();
$planeArray[] = new sevenFortySeven();
$planeArray[] = new sevenFortySeven();
$planeArray[] = new biplane();

for ($x = 0; $x $currentPlane = $planeArray[$x];
if ($currentPlane->preFlightCheck() ) {
$currentPlane->takeOff();
//不管是什么型号的飞机,它都会知道它要起飞了
} else {
print \"飞机出了点问题.\";
}
}

类的静态方法

当处理一个类的对象的时候,你可能放一个对这个对象有用的函数在这个类中,而不是再另写一个特殊类。这样的函数叫做静态方法。一个良好
类应该包含所有有用的(utility)函数。

class Money {

function addTax($amount,$percent){
return $amount + ($amount * $percent);
}


function convertCurrency ($amount, $from, $to) {
//在数据库中查找一个从$from变换到$to的转换率
return $amount * $rate;
}

}

$total = Money::addTax($subtotal,6.5);

$yen = Money::convertCurrency ($usd, \"america\", \"japan\");



方法工厂(Factory Methods)

有时候将代码分成一个一个的块去创建对象很有好处。你可以使用大量的类,也可以使用一个类来决定对象使用工厂类(factory methods)。
工厂类可以帮助你有效的组织你的代码。一般情况下,工厂类包含一个比较大的转换声明并且返回一个合适的对象的实例。让我们看个有关C扫描
仪的例子。有一个Item基本类, 但是也有很多子类,这些子类可以为各种各样的产品调用(比如电子类的, 服装类的...)。

Class Item {
var $price;
var $isTaxable;
var $properties;

function getNewItem($upc) {
//连接到数据库
//查找$upc的类型并将其放入$type变量中
//查找$upc的属性并将其放如$attrib变量中;
return new $type($attrib);
}
}

class produce extends Item {

function produce ($a) {
$this->properties = $a;
}


function requiresScale() {
return true;
}
}


class hardlines extends Item {

function hardlines ($a) {
$this->properties = $a;
}

function requiresSclae() {
return false;
}
}


while ( $upc = $scanner->next_code() ) { //假设有一个扫描仪的类

$z = Item::getNewItem($upc);

if ($z->requiresScale() ) {
echo \"需要尺寸!\";
}

$subtotal += $z->properties[\"price\"];
}



PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

91

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

27

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

5

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

27

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 15.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 1万人学习

C# 教程
C# 教程

共94课时 | 8.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号