Object Oriented函数详解

首页 / PHP入门教程 / Object Oriented函数详解

无涯教程可以想象宇宙是由不同的物体(如,太阳,地球,月亮等)组成的。同样,可以想象汽车是由不同的物体(如,车轮,转向,齿轮等)组成的。同样,存在面向对象的编程概念,它们将一切都假定为一个对象,并且使用不同的对象实现软件。

定义类

在PHP中定义新类的一般形式如下-

<?php
   class phpClass {
      var $var1;
      var $var2="constant string";
      
      function myfunc ($arg1, $arg2) {
         [..]
      }
      [..]
   }
?>

这是定义Book类型的类的示例-

<?php
   class Books {
      /* Member variables */
      var $price;
      var $title;
      
      /* Member functions */
      function setPrice($par){
         $this->price=$par;
      }
      
      function getPrice(){
         echo $this->price ."<br/>";
      }
      
      function setTitle($par){
         $this->title=$par;
      }
      
      function getTitle(){
         echo $this->title ." <br/>";
      }
   }
?>

变量 $this 是一个特殊变量,它指向同一对象。

创建对象

一旦定义了类,就可以根据需要创建任意数量的对象。以下是如何使用 new 运算符创建对象的示例。

$physics=new Books;
$maths=new Books;
$chemistry=new Books;

在这里创建了三个对象,这些对象彼此独立,并且它们将分别存在。接下来,将看到如何访问成员函数和处理成员变量。

调用函数

创建对象后,您将能够调用与该对象相关的成员函数。一个成员函数将只能处理相关对象的成员变量。

下面的示例演示如何通过调用成员函数来设置三本书的标题和价格。

$physics->setTitle( "Physics for High School" );
$chemistry->setTitle( "Advanced Chemistry" );
$maths->setTitle( "Algebra" );

$physics->setPrice( 10 );
$chemistry->setPrice( 15 );
$maths->setPrice( 7 );

现在,您调用另一个成员函数来获取上述示例中设置的值-

$physics->getTitle();
$chemistry->getTitle();
$maths->getTitle();
$physics->getPrice();
$chemistry->getPrice();
$maths->getPrice();

这将产生以下输出-

Physics for High School
Advanced Chemistry
Algebra
10
15
7

构造函数

构造函数是一种特殊类型的函数,每当创建一个对象时,它们都会自动调用。 因此通过构造函数初始化许多事情,从而充分利用了这种行为。

PHP提供了一个称为 __construct()的特殊函数来定义构造函数,您可以将任意数量的参数传递给构造函数。

下面的示例将为Books类创建一个构造函数,并在创建对象时初始化该书的价格和标题。

无涯教程网

function __construct( $par1, $par2 ) {
   $this->title=$par1;
   $this->price=$par2;
}

现在,无涯教程不需要单独调用set函数来设置价格和标题。只能在创建对象时初始化这两个成员变量。请检查以下示例-

$physics=new Books( "Physics for High School", 10 );
$maths=new Books ( "Advanced Chemistry", 15 );
$chemistry=new Books ("Algebra", 7 );

/* Get those set values */
$physics->getTitle();
$chemistry->getTitle();
$maths->getTitle();

$physics->getPrice();
$chemistry->getPrice();
$maths->getPrice();

这将产生以下输出-

  Physics for High School
  Advanced Chemistry
  Algebra
  10
  15
  7

析构函数

像构造函数一样,您可以使用函数 __destruct()定义析构函数,您可以在析构函数中释放所有资源。

继承类

通过使用extends子句,PHP类定义可以选择从父类定义继承。语法如下-

class Child extends Parent {
   <definition body>
}

继承的作用是子类(或子类或派生类)具有以下特征-

  • 自动具有父类的所有成员变量声明。

  • 自动具有与父级相同的成员函数,它们的函数与父级中的那些函数相同。

下面的示例继承Books类,并根据需求添加更多函数。

class Novel extends Books {
   var $publisher;
   
   function setPublisher($par){
      $this->publisher=$par;
   }
   
   function getPublisher(){
      echo $this->publisher. "<br />";
   }
}

现在,除了继承的函数之外,Novel类保留了两个附加的成员函数。

覆盖函数

子类中的函数定义会覆盖父类中具有相同名称的定义。在子类中,无涯教程可以修改从父类继承的函数的定义。

在下面的示例中,重写getPrice和getTitle函数以返回一些值。

function getPrice() {
   echo $this->price . "<br/>";
   return $this->price;
}
   
function getTitle(){
   echo $this->title . "<br/>";
   return $this->title;
}

公有方法

除非另有说明,否则类的属性和方法是公共(public)的。也就是说,可以在三种可能的情况下访问它们-

  • 从声明它的类的外部开始

  • 在声明它的类中

  • 从另一个类中,该类实现了声明该类的类

到目前为止,程已经将所有成员视为公共成员。如果您希望限制类成员的可访问性,则可以将类成员定义为private 私有或protected受保护的 

私有方法

通过指定成员私有,可以将其访问权限限制为声明该成员的类。不能从继承了声明该私有成员的类的类中引用该私有成员,并且不能从该类外部访问该私有成员。

可以使用成员前面的 private 关键字将其设为私有成员。

class MyClass {
   private $car="skoda";
   $driver="SRK";
   
   function __construct($par) {
      //Statements here run every time
      //an instance of the class
      //is created.
   }
   
   function myPublicFunction() {
      return("I'm visible!");
   }
   
   private function myPrivateFunction() {
      return("I'm  not visible outside!");
   }
}

当 MyClass 类由另一个使用扩展继承的类继承时,myPublicFunction()和$driver也将可见。扩展类不会知道或无法访问myPrivateFunction和$car,因为它们被声明为私有的。

受保护方法

protected 属性或方法可以在声明它的类以及扩展该类的类中访问。 protected 成员在这两种类别之外不可用。 可以通过在成员前面使用protected关键字来保护该成员。

这是MyClass的不同版本-

class MyClass {
   protected $car="skoda";
   $driver="SRK";

   function __construct($par) {
      //Statements here run every time
      //an instance of the class
      //is created.
   }
   
   function myPublicFunction() {
      return("I'm visible!");
   }
   
   protected function myPrivateFunction() {
      return("I'm  visible in child class!");
   }
}

定义接口

定义接口以为实现者提供通用函数名称。 不同的实现者可以根据其要求实现这些接口。 可以说,接口是由开发人员实现的框架。

从PHP5开始,可以定义一个接口,如下所示:

interface Mail {
   public function sendMail();
}

然后,如果另一个类实现了该接口,则如下所示:

class Report implements Mail {
   //sendMail() Definition goes here
}

声明常量

常量有点像变量,因为它拥有一个值,但实际上更像一个函数,因为常量是不可变的。声明常量后,它就不会更改。

声明一个常量很容易,就像在此版本的MyClass中所做的那样-

class MyClass {
   const requiredMargin=1.7;
   
   function __construct($incomingValue) {
      //Statements here run every time
      //an instance of the class
      //is created.
   }
}

在此类中,requiredMargin是一个常量。它用关键字const声明,在任何情况下都不能更改为1.7以外的任何值。请注意,常量名没有变量名的前导$。

抽象类

抽象类是不能实例化的类,只能继承。您用关键字抽象声明一个抽象类,如下所示:

从抽象类继承时,在父类的声明为abstract的所有方法都必须由子类代实现。此外,必须以相同的可见性定义这些方法。

abstract class MyAbstractClass {
   abstract function myAbstractFunction() {
   }
}

请注意,抽象类内部的函数定义也必须以关键字abstract开头。在非抽象类中包含抽象函数定义是不合法的。

static关键字

将类成员或方法声明为静态可以使它们无需实例化即可访问。实例化的类对象无法访问声明为静态的成员。

<?php
   class Foo {
      public static $my_static='foo';
      
      public function staticValue() {
         return self::$my_static;
      }
   }
	
   print Foo::$my_static . "\n";
   $foo=new Foo();
   
   print $foo->staticValue() . "\n";
?>	

final关键字

PHP 5引入了final关键字,该关键字通过在定义的前面加上final来防止子类覆盖方法。如果类本身是final定义的,则无法被继承。

以下示例导致致命错误:无法覆盖最终方法BaseClass::moreTesting()

链接:https://www.learnfk.comhttps://www.learnfk.com/php/php-object-oriented.html

来源:LearnFk无涯教程网

<?php

   class BaseClass {
      public function test() {
         echo "BaseClass::test() called<br>";
      }
      
      final public function moreTesting() {
         echo "BaseClass::moreTesting() called<br>";
      }
   }
   
   class ChildClass extends BaseClass {
      public function moreTesting() {
         echo "ChildClass::moreTesting() called<br>";
      }
   }
?>

调用父构造函数

与其为子类编写全新的构造函数,不如通过显式调用父类的构造函数,然后再执行实例化子类所需的任何事情来编写它。这是一个简单的示例-

class Name {
   var $_firstName;
   var $_lastName;
   
   function Name($first_name, $last_name) {
      $this->_firstName=$first_name;
      $this->_lastName=$last_name;
   }
   
   function toString() {
      return($this->_lastName .", " .$this->_firstName);
   }
}
class NameSub1 extends Name {
   var $_middleInitial;
   
   function NameSub1($first_name, $middle_initial, $last_name) {
      Name::Name($first_name, $last_name);
      $this->_middleInitial=$middle_initial;
   }
   
   function toString() {
      return(Name::toString() . " " . $this->_middleInitial);
   }
}

在此示例中,无涯教程有一个具有两个参数的构造函数的父类(Name)和一个具有三个参数的构造函数的子类(NameSub1)。 NameSub1的构造函数通过使用::语法显式调用其父构造函数,然后设置一个附加字段来起作用。同样,NameSub1根据其覆盖的父函数定义其非构造函数toString()函数。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Go语言从入门到实战 -〔蔡超〕

MongoDB高手课 -〔唐建法(TJ)〕

图解 Google V8 -〔李兵〕

基于人因的用户体验设计课 -〔刘石〕

Spring编程常见错误50例 -〔傅健〕

手把手带你写一门编程语言 -〔宫文学〕

商业思维案例笔记 -〔曹雄峰〕

深入浅出可观测性 -〔翁一磊〕

结构思考力 · 透过结构看问题解决 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)