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

对象

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

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

设计图

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

扩展的设计图

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

抽象

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

包装

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

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

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

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

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

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

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;
}
}

?>  

如何使用定义好的类

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

<?php

$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 < count($planeArray); $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\"];
}

时间: 2024-09-15 05:40:54

php的类和对象(翻译:midiguy)的相关文章

&amp;gt; 第五章 类(rainbow 翻译)*1 (来自重粒子空间)

<<展现C#>> 第五章 类(rainbow 翻译)出处:http://www.informit.com\matter\ser0000002正文:第五章  类       前一章讨论了数据类型和它们的用法.现在我们转移到C#中至关重要的结构--类.没有了类,就连简单的C#程序都不能编译.这一章假定你知道了一个类的基本组成部分:方法.属性.构造函数和析构函数. C#在其中增加了索引和事件.       在这一章中,你学到下列有关类的话题.      . 使用构造函数和析构函数    

走近VB.Net(一),VB中的族,类,对象(摘录部分MSDN)

对象 走近VB.Net(一),VB中的族,类,对象 VB.Net是面向对象(object-oriented)的,又称为物件(object)导向(oriented).在VB.Net中所有的变量类型都是基于object,而不是VariantDim x As Variant 会被升级为 Dim as object.如果你不理解对象,暂时你可以把他理解为一段数据,他是实际存在于内存的,所以对象以称为实例(instance)而类(class)就是类别,他定义一群对象,是一个对象的群体,并定义方法成员.所以

java中this.对象 表示本类的对象,那this.方法 表示本类的方法吗

问题描述 java中this.对象 表示本类的对象,那this.方法 表示本类的方法吗 java中this.对象 表示本类的对象,那this.方法 表示本类的方法吗 解决方案 你的理解是正确的,可以指向本类方法,还有个SUPER,可以指向父类方法 解决方案二: this表示本类,调用方法是一般对象.方法,即调用某个类的某个方法 解决方案三: this在java中我见过比较好的理解是这样的: java中的this翻译成中文意思都可以理解为"我的"的意思,在你定义的那个类里面,不管你在哪里

深入Objective-C Runtime机制(一):类和对象的实现

1.概要      对于Runtime系统,相信大部分iOS开发工程师都有着或多或少的了解.对于Objective-C,Runtime系统是至关重要的,可以说是Runtime系统让Objective-C成为了区分于C语言,C++之外的一门独立开发语言,让OC在拥有了自己的面向对象的特性以及消息发送机制.并且因为其强大的消息发送机制,也让很多人认为Objective-C是一门动态语言(实际上每种语言都具有一定的动态性,只是OC的Runtime更加强大,但它仍比不上Python,Lua等动态语言).

php基础知识:类与对象(5) static_php技巧

Declaring class members or methods as static makes them accessible without needing an instantiation of the class. A member declared as static can not be accessed with an instantiated class object (though a static method can).  声明静态的类变量和方法可以不需要实例化类对象的

解析Java的JVM以及类与对象的概念_java

Java虚拟机(JVM)以及跨平台原理 相信大家已经了解到Java具有跨平台的特性,可以"一次编译,到处运行",在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM). JVM也是一个软件,不同的平台有不同的版本.我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件.Java虚拟机就是负责将字节码文件翻译成特定平

java private-java 一个类的对象访问私有属性的问题

问题描述 java 一个类的对象访问私有属性的问题 public class ModifierTest1 { public static void main( String[] args ) { A a = new A(); //System.out.println(a.s); a.f(); } } class A { private int i; private String s; public A() { i = 123; s = "hello"; } public void f(

PHP的类与对象

自 PHP 5 起完全重写了对象模型以得到更佳性能和更多特性.这是自 PHP 4 以来的最大变化.PHP 5 具有完整的对象模型.  PHP 5 中的新特性包括访问控制,抽象类和 final 类与方法,附加的魔术方法,接口,对象复制和类型约束.  PHP 对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝.   属性: 类的变量成员叫做属性 属性声明关键字可以是public protected private 属性中的变量是可以初始化的但初始话必须是常数不能是计算式

PHP面向对象编程详解:类和对象

PHP面向对象编程详解:类和对象 从OOP的视角看,不应区分语言.无论是C++.无论是Java.无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思想轻松的跳跃.便没有对于Java..net.PHP 之间谁强谁弱的争执了. 希望这个介绍PHP5面向对象编程(OOP)的资料能让初学者受益,能让更多的PHPer开始转向OO的编程过程. 相对PHP4,PHP5在面向对象方面改变了很多.我们将只介绍PHP5环境下的面向对象.而我们必须改变自己来跟随PHP5的发展.如果代