无涯教程可以想象宇宙是由不同的物体(如,太阳,地球,月亮等)组成的。同样,可以想象汽车是由不同的物体(如,车轮,转向,齿轮等)组成的。同样,存在面向对象的编程概念,它们将一切都假定为一个对象,并且使用不同的对象实现软件。
在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开头。在非抽象类中包含抽象函数定义是不合法的。
将类成员或方法声明为静态可以使它们无需实例化即可访问。实例化的类对象无法访问声明为静态的成员。
<?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"; ?>
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()函数。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)