在本 PHP 教程中,您将学习 PHP 中面向对象编程的所有知识。我们将详细讨论类、对象、构造函数、析构函数、访问修饰符、继承、抽象类、接口、特性、静态方法、静态属性等等。
面向对象编程 (OOP) 是一种基于类和对象概念的编程技术。面向对象意味着我们将程序结构化为各种对象的集合,这些对象既包含数据也包含行为。与侧重于开发对数据执行操作的过程或函数的程序式编程不同,面向对象编程侧重于构建包含数据和函数的对象。在面向对象编程中,主要关注数据安全性。
类是程序员指定的一种数据类型,它包含局部函数和局部数据。类可以被认为是创建同类型(或同类)对象的多个实例的模板。
对象是类描述的数据结构的单个实例。我们可以创建一次类,然后创建属于它的多个对象。对象也称为实例。
成员变量是在类中声明的变量。这些数据将对当前类外部隐藏,并且只能通过成员函数访问。当对象构造时,这些变量被称为对象的属性。
成员函数是在类中指定的函数,用于检索对象。成员函数也称为方法。
当一个类通过继承父类的现有行为来定义时,这被称为继承。在这种情况下,子类将继承所有父类的成员函数和变量。
父类是被其他类继承的类。父类也称为基类或超类。
子类是从其他类继承的类。子类也称为派生类。
多态性是面向对象的一个概念,其中同一个函数可以有多种作用。例如,函数名将保持不变,但它将接受不同数量的参数并执行新的任务。
重载是一种多态性,其中某些或所有运算符根据它们接收的参数类型具有不同的实现。类似地,具有不同实现的函数可以被重载。
数据抽象是隐藏(抽象)实现细节的任何数据格式。
封装指的是我们将所有数据和成员函数封装到单个对象中的概念。
构造函数指的是一种特殊的函数,每当从类创建对象时都会自动调用它。
析构函数指的是一种函数,如果一个项目被删除或超出范围,它会自动被调用。
面向对象编程的两个基本组件是类和对象。类是变量和函数的独立集合,它们协同工作以完成一个或多个定义好的任务,而对象是类的单个实例。类充当模板或蓝图,可以从中构造许多不同类型的对象。单个对象在形成时继承相同的基本属性和行为,但每个对象可以具有特定属性的不同值。
在 PHP 中定义类,我们使用 class 关键字,后跟类名和一对花括号“{}”。
语法
<?php
class classname {
// code goes here...
}
?>
示例
<?php
class Students
{
public $name;
public $age;
function set_detail($name, $age)
{
$this->name = $name;
$this->age = $age;
}
function get_details()
{
return "Name is " . $this->name . " and Age is " . $this->age;
}
}
?>
类 Students 中的变量 name 和 age 是成员变量。类 Students 中的方法 set_detail() 和 get_details() 是成员函数。
没有对象,类就没有意义。一个类可以用于生成许多对象。每个对象都具有类中声明的所有属性和方法,但它们的属性值会有所不同。
使用 new 关键字后跟类名来定义类的对象。
<?php
class Students
{
public $name;
public $age;
function set_detail($name, $age)
{
$this->name = $name;
$this->age = $age;
}
function get_details()
{
return "Name is " . $this->name . " and Age is " . $this->age;
}
}
$student1 = new Students();
$student2 = new Students();
$student1->set_detail('John', 19);
$student2->set_detail('Roy', 18);
echo $student1->get_details();
echo "\n";
echo $student2->get_details();
?>
输出
Name is John and Age is 19 Name is Roy and Age is 18
“$this”关键字用于表示当前对象。它只在方法内部可用。
instanceof 关键字用于检查对象是否属于该类。
示例
<?php
class Students
{
public $name;
public $age;
function set_detail($name, $age)
{
$this->name = $name;
$this->age = $age;
}
function get_details()
{
return "Name is " . $this->name . " and Age is " . $this->age;
}
}
$student = new Students();
var_dump($student1 instanceof Students);
?>
输出
bool(true)
构造函数是一种在创建对象时调用的函数。因此,我们充分利用这种行为,使用构造函数初始化多个项目。
要在 PHP 中定义构造函数,我们使用 __construct() 函数。
示例
<?php
class Students
{
public $name;
public $age;
function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
function get_details()
{
return "Name is " . $this->name . " and Age is " . $this->age;
}
}
$student1 = new Students("John", 18);
echo $student1->get_details();
?>
输出
Name is John and Age is 18
当对象被销毁或脚本结束或终止时,会调用析构函数。如果您定义了析构函数,PHP 会在脚本结束时自动调用它。
要在 PHP 中定义析构函数,我们使用 __destruct() 函数。
示例
<?php
class Students
{
public $name;
public $age;
function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
function __destruct()
{
echo "Name is " . $this->name . " and Age is " . $this->age;
}
}
$student1 = new Students("John", 18);
?>
输出
Name is John and Age is 18
extend 关键字允许类继承另一个类的属性和方法。这种可扩展性方法被称为继承。这很可能是使用面向对象编程方法的一个令人信服的原因。
要继承一个类,我们使用 extends 关键字,后跟父类名。
示例
<?php
class Students
{
public $name;
public $age;
function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
class DisplayStudents extends Students
{
function get_details()
{
return "Name is " . $this->name . " and Age is " . $this->age;
}
}
$student1 = new DisplayStudents('John', 19);
echo $student1->get_details();
?>
输出
Name is John and Age is 19
在使用类时,您甚至可以使用访问关键字来限制对其属性和方法的访问,以实现更多控制。有三个可见性关键字(从最可见到最不可见)定义了属性和方法如何以及从何处被查看和修改,它们是 public、protected 和 private。
示例
<?php
class Students
{
public $roll_no;
public $name;
public $age;
function __construct($roll_no, $name, $age)
{
$this->roll_no = $roll_no;
$this->name = $name;
$this->age = $age;
}
}
class DisplayStudents extends Students
{
public function get_name()
{
echo "\nName is " . $this->name;
}
protected function get_age()
{
echo "\nAge is " . $this->age;
}
private function get_roll_no()
{
echo "RollName is " . $this->roll_no;
}
}
$student1 = new DisplayStudents(101, 'John', 19);
$student1->get_name();
$student1->get_roll_no(); // it will throw an error since it is protected
$student1->get_age(); // it will throw an error since it is private
?>
当父类具有命名方法但要求其子类完成职责时,这被称为抽象类和方法。具有至少一个抽象方法的类称为抽象类。抽象方法是指已声明但尚未在代码中实现的方法。从抽象类继承时,子类方法必须具有与抽象类方法相同的名称和相同或限制较少的访问修饰符。因此,如果抽象方法是受保护的,则子类方法也必须是受保护的或公共的,但不能是私有的。此外,所需参数的类型和数量必须相同。但是,子类可能包含额外的可选参数。
要定义抽象类,我们使用 abstract 关键字。
示例
<?php
abstract class Languages
{
public $name;
public function __construct($name)
{
$this->name = $name;
}
abstract public function intro(): string;
}
class Python extends Languages
{
public function intro(): string
{
return "$this->name uses Python for Programming...";
}
}
class PHP extends Languages
{
public function intro(): string
{
return "$this->name uses PHP for Programming...";
}
}
$John = new Python("John");
echo $John->intro();
echo "\n";
$Roy = new PHP("Roy");
echo $Roy->intro();
echo "\n";
?>
输出
John uses Python for Programming... Roy uses PHP for Programming...
接口的定义是为了向实现者提供通用的函数名称。这些接口可以由不同的实现者根据他们的需求以不同的方式实现。接口类似于类,不同之处在于它不能包含代码。接口可以定义方法的名称和参数,但不能定义其内容。
要定义接口类,我们使用 interface 关键字。
示例
<?php
interface Greeting
{
function sayHai();
}
class Welcome implements Greeting
{
function sayHai()
{
echo "Hai! All Welcome to learnetutorials.com";
}
}
$welcome = new Welcome();
$welcome->sayhai();
?>
输出
Hai! All Welcome to learnetutorials.com
PHP 只允许单继承,这意味着子类只能从一个父类继承。那么,如果一个类需要继承多个行为怎么办?OOP 特性解决了这个问题。可以使用特性声明可在各种类中使用的方法。可以在特性中添加可在各种类中使用的方法和抽象方法,并且这些方法可以具有任何访问修饰符(公共、私有或受保护)。
要定义特性类,我们使用 trait 关键字。
示例
<?php
trait sayHai
{
public function sayHai()
{
echo "Hai! All Welcome to learnetutorials.com... ";
}
}
trait intro
{
public function intro()
{
echo "We learn to code...";
}
}
class Welcome
{
use sayHai, intro;
}
$welcome = new Welcome();
$welcome->sayhai();
$welcome->intro();
?>
输出
Hai! All Welcome to learnetutorials.comHai! All Welcome to learnetutorials.com... We learn to code...
除了可见性之外,属性和方法还可以标记为静态,这使得它们无需类实例化即可使用。作用域解析运算符 (::) 可用于访问静态属性和方法,如下所示:ClassName::$property 和 ClassName::method ()。
示例
<?php
class Welcome
{
public static $sayHai = "Hai! all Welcome to learnetutorials.com... ";
public static function sayHello()
{
echo self::$sayHai;
}
}
echo Welcome::$sayHai;
Welcome::sayHello();
?>
输出
Hai! all Welcome to learnetutorials.com... Hai! all Welcome to learnetutorials.com...