了解PHP高级面向对象编程

Tags: php

无论是编程语言开发人员使用的任何编程语言,面向对象编程(OOP)都是一种重要的技术,而PHP也不例外。本文将讨论如何在PHP中开发先进的面向对象的程序。

简介:

PHP是用来开发网页的服务器端脚本语言。在近代,PHP由于其简单已经成为流行的服务器端开发工具。PHP代码可以组合使用HTML代码,一旦PHP代码被执行,Web服务器返回HTML或image内容,可以被浏览器解释。我们都知道面向对象的编程或OOP的重要性,这是广泛使用的现代编程语言的技术。

PHP中常见的OOP概念:

继承 – 继承是最重要的最常见的编程语言采用面向对象编程的概念。继承是基于父类和子类的原则。在PHP中,我们通过扩展类实现继承。通过扩展一个类,子类继承父类的属性,另外我们可以添加一些更多的特性。

清单1 - 继承的示例代码

class Employee {
    public $firstName = "";
    public $lastName = "";
    public $eCode = "";
    public $dept = "";
 
    public function dailyCommonTask() {
        // Code for routine job
    }
}

class Accountant extends Employee {
    public function processMonthlySalary($eCode) {
        // Code for processing salary
    }
}

在代码段上,我们看到,Accountant类是扩展Employee类的。首先会计师是员工,所以他执行日常的工作就像其他员工一样。同时,他会进行会计的工作来处理其他员工的工资。

Public,Private和Protected

 正如任何面向对象的语言,PHP也包括公共,私有和受保护的访问修饰符的概念。

   •Public - 对于具有公共访问的代码是可见的,并且可以被任何代码从任何地方进行修改。
   •Private - 对于具有私有访问的代码是可见的,只能从类中进行修改。
   •Protected - 具有受保护的访问代码是可见的,并且可以从相同的类或任何其子类进行修改。

重载

重载功能使我们有两个方法具有相同的名字而含有不同的参数。显示在下面的代码片段:


清单2 - 重载的示例代码

class Accountant extends Employee {
    public function processMonthlySalary($eCode) {
        // Code for processing salary
    }
    public function processMonthlySalary($eCode, $variablePayFlag, $variablePercentage) {
        if($variablePayFlag) {
            echo "Please process the salary with variable pay ";
        } else {
            echo " Please process the salary without variable pay ";
        }
    }
}

在上面的代码中,我们有两个方法具有相同的名字('processMonthlySalary')。在一个组织中,并不是所有的员工都有浮动工资。因此,会计师将不得不处理采用两种不同的薪水计算方法:
      •浮动薪酬
      •如果没有浮动薪酬
在处理与浮动薪酬的工资时,会计需要提及可变薪酬部分的金额。

在上面的例子中,我们解释了方法重载的一般概念。但实际执行过程中,我们需要使用func_get_args()来处理带有不同参数的多个方法签名(有相同的方法名)PHP函数。func_get_args()是一个PHP函数,它包含传递给他的函数中所有的参数(保存为数组数组)。所以,同样的功能,可以调用不同的参数。
例如,让我们来使用一个myTestFunction()函数,我们要使用它作为一个重载的函数。

function myTestFunction() 
{
    print_r(func_get_args());
}

现在,多次调用此函数可以如下所示。func_get_args()将持每次调用可被使用的参数。在第一次调用没有传递任何参数,第二个调用传递一个参数,第三个传递两个参数。因此,这个函数可以作为一个重载函数。

myTestFunction ();
myTestFunction ("Hello");
myTestFunction ("Hello","Dear");

还有另一种方式可以在PHP中实现重载- 使用__call()和__callStatic()方法。

例如,下面的代码段的代码显示了传递的方法名和参数。在这里,$name是区分大小写的。输出将打印的方法名和传递给它的参数

public function __call($name, $arguments)
{
    echo "We are calling in object context '$name' "
         . implode(', ', $arguments). "\n";
}

public static function __callStatic($name, $arguments)
{
    echo "We are calling in static context '$name' "
         . implode(', ', $arguments). "\n";
}

存取和修改器

俗称getter和setter方法,或访问器和修改器,广泛应用于所有的编程语言。访问器(或getter)是用于返回或获取类级变量值的函数。存取器(或setter方法)是用于设置或修改一个类级别的变量的值的函数。这些类型的类被主要用于传输数据。让我们看看下面的例子:

清单3 - 访问器和修改器的示例代码

class Employee {
    public $firstName =  "";
    public $lastName = "";
    public $eCode =  "";
    public $dept = "";
    public function getfirstName() {
        return $this->firstName();
    }
    public function setfirstName($firstName) {
        $this->firstName = $firstName;
    }
    public function getlastName() {
        return $this->lastName();
    }
    public function setlastName($lastName) {
        $this->lastName = $lastName;
    }
    public function getECode() {
        return $this->eCode();
    }
    public function setECode($eCode) {
        $this->eCode = $eCode;
    }
    public function getDept() {
        return $this->dept();
    }
    public function setDept($dept) {
        $this->dept = $dept;
    }
}

这些类型的类是非常有用的,当我们要对整个Employee对象数据进行传输时。

Static

使用static关键字变量和方法是面向对象编程的普通概念。静态意味着该变量或方法是每个类的实例都可用。可以无需创建类的实例而使用静态方法或变量。实际上,静态变量是不经由类的实例进行访问的。在创建静态方法,你必须要小心,$this是不可以在静态方法内使用的。

清单4 - static关键字和方法的示例代码

class StaticSample {
    public static $my_static = 'Sample Static variable';
    public function staticValue() {
        return self::$my_static;
    }
    public static function aStaticMethod() {
        echo "This is the Hello message from static method";
    }
}

class StaticShow extends StaticSample {
    public function checkStatic() {
        return parent::$my_static;
    }

    public function checkStaticMethod() {
        return parent::$aStaticMethod;
    }
}

抽象类

在PHP中,面向对象程序设计的这个概念使用得非常频繁。抽象类不能被实例化,而它们可以被继承。继承抽象类的类也可以是另一个抽象类。 “抽象” - 在PHP中,我们可以通过使用关键字创建抽象类。


清单5 - 抽象类的示例代码

abstract class testParentAbstract {
    public function myWrittenFunction() {
        // body of your funciton
    }
}

class testChildAbstract extends testParentAbstract {
    public function myWrittenFunctioninChild() {
        // body of your function
    }
}

在上面的例子中,我们可以创建子类的实例 - testChildAbstract,但我们不能创建父类的实例 - testParentAbstract。正如我们看到的子类是扩展父类,我们可以在子类中使用父类的属性。我们还可以根据我们的需要在我们的子类中实现父类的抽象方法。

接口

在面向对象的程序设计,接口是方法定义的集合。通过实现一个接口,我们强制类遵循接口定义的方法。在PHP中,接口的定义与任何其他语言是一致的。首先,我们需要使用关键字来定义接口 - “interface”。在实现中,我们只需要在实现类使用'implmenets'关键字。

清单6 - 接口的示例代码

interface myIface {
    public function myFunction($name);
}

class myImpl implements myIface {
    public function myFunction($name) {
        // function body
    }
}

结论

PHP已经成为最流行的Web应用程序开发语言。它已得到增强,支持编程的不同方面,面向对象的特性是最重要的一部分需要我们去理解和掌握的。

本文链接:http://www.4byte.cn/learning/120053/liao-jie-php-gao-ji-mian-xiang-dui-xiang-bian-cheng.html