面向对象编程的理论

面向对象编程的理论

面向对象编程中两个最重要的术语是“类”和“对象”。类是对某个事物的概括定义可以看做是一个蓝图,对象则是对某个事物的具体实现,可以看做是依照蓝图建立起来的房屋。为了实现面向对象编程,我们首先定义类,然后在程序中根据需要实现他们为对象,面向对象变成的原则之一是“模块化”,与模块化相关的概念是“抽象“,面向对象的另一个原则是封装

定义一个类

class ClassName{

}

类包含变量和函数,它们分别称为"属性"和"方法"(当然,我们也可以看到有使用其他术语的).一个类的属性和方法和在一起称作为类的成员

函数是很容易被添加到类中的

class ClassName{
    function functionName(){
        // Function code
    }
}

在类中定义方法与在类外定义函数时一样的,它们可以接受参数、具有默认值、返回值等.
累的属性和类外的变量有一点不太一样.首先,所有的属性在声明时必须用一个关键字指明其"可见性".这些关键字是public、private、protected.

public $var1,$var2;
function functionName(){
    // Function code.
}

如上所示,类属性的声明位于所有方法定义的前面.
属性和普通的变量之间的第二个区别在于:如果属性在声明时被赋予初始值,这个初始值必须是常数,而且,不能是表达式的结果.

class GoodClass{
    public $var1 = 123;
    public $var2 = 'string';
    public $var3 = array(1,2,3);
}

Class BadClass{
    // These won't work!
    public $today = get_date();
    public $square = $num *$num;
}

这里需要注意,属性不是一定要有初始值.另外,除了生命变量的语句之外,类里的其他代码都在类的方法内.我们不能像下面这样在一个类的方法外使用表达式

class BadClass{
    public $num=2;
    public $suqare;
    $square = $num *$num; //No!
}

创建一个简单的、几乎没有什么功能的类,只是为了确定一切可以工作正常

class HelloWorld{
    function sayHello{
    echo '<p>';
    switch($language){
        case 'Dutch':
            echo 'Hallo, wereld!';
            break;
        case 'French':
            echo 'Bonjour,mode!';
            break;
        case 'German':
            echo 'Hallo,Welt!';
            break;
        case 'Italian':
            echo 'Ciao,modo!';
        case 'Spanish':
            echo 'iHola,mudo!';
            break;
        case 'English':
        default:
        echo 'Hello,world';
        break;
    }
    echo '</p>';
    }
}

通过在函数定义之前添加适当的关键字,类的方法也可以设置可见性.如果没有明确指定可见性,那么素有的方法都相当于使用了publc关键字:

public function functionName(){
    // Function code ...
}

创建对象

使用面向对象编程需要两个步骤,第一个步骤是定义一个类,就像刚才定义HelloWold类一样,第二个步骤是通过创建对象(或者类的实例)来使用这个类。

在定义了类之后,创建对象是非常容易的。它只需要使用关键字new就可以了:

    $object = new ClassName();

这样就创建了变量$object,并且其类型是ClassName类型(而不是字符串类型或者数组)。说的更加专业一点,$object是类ClassName的一个实例。
要去调用类里的方法,我们可以使用这样的语法:

$object->methodName('value',32,true);

要访问一个对象的属性,可以使用下面的语法:

    $object->propertyName;

注意,这里我们不能使用属性变量开头的美元符,这个是一个十分常见的解析错误:

    $object->$propertyName; //Error!

(对一个对象方法和属性的引用能力取决于这个成员的可见性)
一旦我们使用完成了一个对象,我们就可以像处理其他事变量那样删除它:

    unset($object);

从技术的角度来说,我们并不是一定要在代码里删除对象,因为一旦脚本结束,对象就会被删除。但是,我认为这样做可以让程序显得更加整洁有序。
需要注意的是:
1.类名并不区分大小写。然而,像其他任何变量一样,在php对象中对象名是区分大小写的。
2.因为PHP里的函数名不区分大小写,所以类里的方法名也是这样

$this属性

虽然HelloWorld类能够完成一个定的工作,但是这仍然是个简单的示例程序。这个类包含一个方法,但是它不包含任何属性(变量)
从前面较少的“定义一个类”内容中可以看出,类的属性
1.是变量
2.必须声明为public、private或者protected
3.如果在声明时进行初始化,那么必须是使用静态值(不能是表达式的结果)
这就是定义各类的属性的规则,但是使用这些属性还需要其他一系列的的信息。正如我们已经解释过的,通过对象,我们可以使用对象操作符(->)类获取对象的属性。

    $object->propertyName;

这里存在的一个问题是在类自身里面(比如,在一个类的方法定义里),我们必须使用一种替代的语法方法来获取类的属性。我们不能像下面这样来做

class BadClass{
    public $var;
    function do(){
        // This won;t work:
        print $var;
    }
}

这里的do方法不能像这样访问$var变量。解决这个问题的一个办法是使用一个特殊的变量,$this。一个类中的$this变量总是指向该类的当前实例(也就是包含进来的对象)在一个方法内,我们可以使用语法$this->attributeName来访问类的实例及其属性

创建构造函数

构造函数是一个特殊的方法,它与标准方法的区别有三点:
1.其名称永远是 __construct()
2.当创建对象时,它总是会理解被自动调用。
3.它不嗯给你有返回(return)语句。
定义个构造函数的语法如下面代码所示:

    public $var;
    function __construct(){
        // Function code
    }

构造函数可以用于连接数据库、设置cookie或者构造初始值。从基本上来说,构造函数用于完成在创建对象时总是要进行—而且要首先来做的工作。
由于构造函数还是一个方法而已,他可以接受参数,这些参数的值实在创建对象的时候提供的。

class User{
    function __construct($id){
        // Function code
    }
}
$me = new User(12);

创建析构函数

有构造函数,自然就会有析构函数。构造函数是在对象创建时自动被调用,而析构函数是在对象销毁的时候自动被调用。在公开删除对象的时候,就会发生下面的情况。

    $obj = new ClassName();
    unset($obj); // Calls destructor,too.

或者在脚本结束的时候(在这个时候php会释放变量所使用的内存)也会发生这种情况
析构函数的定义应该是这个样子

class ClassName{
    // Attributes and methods.
    function __destruct(){
        // Function code
    }
}

析构函数确实和构造函数以及其他方法有所不同,他不能接受任何参数。

使用UML设计类

首先UML(统一模型语言)的介绍,一种面向对象变成设计的图形化展示工具。
一个类的定义从核心上来说有三个部分
1.他的名字
2.他的属性
3.他的方法
UML创建一个类的图标来图形化的展示一个类:
每个累的框图分为三个部分,类名位于框图的最上面。框图的第二部分用于标识类的属性,并且第三部分将列举类的方法

| ClassName |
| attribute |
| method() |
对属性来说,属性的类型(比如,字符串、数组等)被列举在属性名称的后边,比如

userId:number
username:string
如果属性有一个默认值,我们也需要在框图中展现出来
width:number =0

要定义一个类途中的方法,我们需要将方法名称放在最开头,他的参数和类型需要放在括号内。通常情况下它后面会紧跟着方法返回值的数据类型:

    sayHello(language:string):void

这里sayHello()方法不会返回任何东西,因为他的返回值设为void

设计类图的好处
1.如果我们花费精力来做类的可视化设计,并且思考是否充分反应出设计应用程序的需要,我们将可以有效减少将来修改类定义的次数。
2.面向对象编程的一个原则就是封装:将模块拆分,并且隐藏其具体的实现过程。一个UML类图,可以为这些类充当一个用户向导的角色,因为类图中列举的累的属性、方法以及参数等信息。任何地方如果需要使用已经模块化了的类,我们就可以在代码中直接使用这些类、类的方法以及属性等,而不需要去查看类背后的代码。事实上,我们可以将UML设计图和代码以前提供给我们的客户,作为一项额外的服务。

使用phpDocumentor生成更好的文档

和使用UML创建类图一样,还有一个就是使用phpDocumentor创建一个更加友好的代码文档
使用phpDocumentor格式有两个明显的好处
1.它包含了大量最佳的实践和推荐的样式
2.phpDocumentor将为我们生成html格式或者其他格式的文档。
phpDocumentor读取我们的php代码和注释,然后生成文档。

一个文档块可以放在下面代码之前
1.类定义
2.函数或者方法定义
3.变量声明
4.常量定义
5.文件包含
一个文档块应该位于一个脚本的最开始,以便于说明整个文件
要在整个项目中使用phpDocumentor文档工具,我们可以使用下面的命令来文档化当前整个目录

phpdoc -d . -t docs

发表评论

发表评论

*

沙发空缺中,还不快抢~