面向对象编程(PHP)
面向对象编程 (mian4 xiang4 dui4 xiang4 bian1 cheng2) 是一种编程范式。
面向对象(Object Oriented Programming,简称OOP)是一种系统构建的方法。顺带一提,系统是指各个元素相互影响并作为整体运作的结构概念,它是通过组合类来构建的。
假设要将一个系统的源代码编写在一个类内,尽管有可能将所有内容都写入其中,但代码会变得冗长且复杂,从而降低可读性,并且一旦需要修改或添加功能,就会产生大量的劳动量,这一点很容易想象得到。
因此,根据各个角色创建并分配类,将每个类视为具有特定角色的物体(对象),这就是面向对象的产物。
具体来说,一台电脑包括键盘、鼠标、显示器等组件。
就像這個零件中有各自的角色一樣,我們可以為具有角色的物件分類並分類相應的類別。這樣,當鍵盤出現故障時,只需要修改鍵盤類別的源代碼即可修復,同樣地,當我們想要新增功能時,只需更改相關的類別即可。
换句话说,面向对象是一种按照物体的具体角色将其分成类,并定义物体之间的关系来构建系统的系统构建思想,它是一种代码组织的方式。
面向对象带来的好处
在构建大型系统时,面向对象的编程方法可以带来许多优势。
可以根据功能的角色,将代码分成类或文件等不同的源代码,从而实现多人共同开发一个系统的目的。
另外,由于将源代码分离,短而简洁的代码具有高可读性,同时处理也简单,测试也更容易执行。
按照角色进行划分的班级,可以在外部需要时及其他各种场合进行重复使用。
例如,在会计系统中,预计消费税计算程序可以在各种场合使用,因此如果将消费税计算处理整合为一个整体,便可以实现重复使用。
由于可以理解该类的创建意图,因此易于管理信息,即使发生规格变更,也容易确定变更位置,影响范围较小,具有高维护性的优点。
因此,采用面向对象的语言在构建大型系统时往往被广泛采用。
关于班级
班级可以说是一份设计图纸。
举个例子,当我们想要制造一辆汽车时,想象一下汽车可能拥有的功能,除了具有颜色和所有者等特定信息外,汽车还配备了加速、减速、车灯的点亮和熄灭等必要功能,以确保其作为一辆汽车的存在。
虽然颜色和所有者可以改变,但基本上是车辆固有属性。
当踩下油门时,这些功能负责加速;当踩下刹车时,负责减速,这称为方法。
在中文中,我们可以这样表达:
定义了这些物体的信息和功能的东西称为类,可以说类就是该物体的设计图。因此,类中可以定义方法和声明属性。
关于实例
由前述可知,类就像一张纸一样,所以无法仅通过一张纸的类本身来进行处理。
因此,需要根据这份设计图生成一个实体来执行处理。
根据这个设计图所创建的实物被称为实例,将其具体化的过程称为实例化。
雖然可以說實際上,實例本身是一個不可移動的純粹物體。
因此,對於實例化的物體,需要提供命令,如調用方法等。
(在實例化時,也可以在類內自動執行實例的處理記述)
如果有设计图纸,可以从同一类中生成多个不同个性的汽车,因此在设计图纸中需要定义所有汽车共同拥有的内容。
虽然如此,如果在车辆设计图的所有者栏中写着“所有者是太郎”,那么所有车辆的所有者都会被生成为太郎,因此最好不要在一开始就决定属性值,类似于变量的初始化。
因此,最好的做法是只在类中定义属性的标题,并在每个实例上分别赋值。
根据这个理论,在实例化之后,需要进行填充属性值的描述。因此,理想情况下,我们创建一个模糊存在的实例,并同时填充值以实现完全实体化。在PHP中,我们将其称为构造函数。
如果使用构造函数,就可以在实例生成时自动执行处理。
封装
在面向对象编程中有三个重要的特性。
其中之一是封装。
就拿人类这个类来说,人类有一个属性叫做名字。
然而,这个名字并不是随意可以轻易更改的,也不是别人故意可以改变的,而且如果在SNS等社交媒体上公开真实姓名,个人信息就会被传播,因此也是一个想要隐藏的信息。
如果想要进行更改,本人需要在政府部门进行手续办理。为了防止恶意修改属性、疏忽失误或意外情况下外部类的修改,必须采取相应措施。
另外,车辆具有踩油门就前进的不可动摇的功能。如果改变这个功能,将动摇车辆的存在意义,因此要将这个功能封闭在密封容器内。
为了实现这一目标,存在着叫做封装的机制。
封装功能之一是访问控制,其中包含私有(private)和公共(public)两种权限。
私有(private)是一种修饰符,用于允许仅在类内部进行访问。私有化后,它变成了一个无形的存在,无法被外部类进行修改甚至是引用。
基本上,将属性的访问权限设置为私有是最理想的。
在相反的情况下,如果给它加上public修饰符,就可以从外部类中引用和修改它。
如果使用public
<?php
class Human { //人間クラスを定義
puclic $name //氏名属性を定義してパブリック修飾子を付ける
public function __construct($name) {
$this->name = $name;
}
}
//クラス外
$japanese = new Human('taro'); //人間クラスをインスタンス(実体)化
echo $japanese->name; //japaneseインスタンス変数の氏名属性値を出力
//出力結果:taro
?>
?>
如果使用private
<?php
class Human { //人間クラスを定義
private $name //氏名属性を定義してプライベート修飾子を付ける
public function __construct($name) {
$this->name = $name;
}
}
//クラス外
$japanese = new Human('taro'); //人間クラスをインスタンス(実体)化
echo $japanese->name; //japaneseインスタンス変数の氏名属性値を出力
//出力結果:エラー
?>
获取者
如果将属性的访问权限设为private,那么就无法从类的外部获取属性的值,就像上面的代码一样。
因此,作为一个仅返回属性值的方法之一,存在着”getter”。
通常情况下,getter被命名为”get属性名”。
<?php
class Human {
private $name //プライベート修飾子を付けている
public function __construct($name) {
$this->name = $name;
}
public function getName() { //ゲッターを定義
return $this->name;
}
}
//クラス外
$japanese = new Human('taro');
echo $japanese->getName(); //ゲッターの呼び出し
//出力結果:taro
?>
接应员
私たちがプライベートアクセス修飾子でプロパティの値を変更できない場合、その値を変更するための「セッター」と呼ばれるメソッドが存在します。
セッターメソッドは通常、「setプロパティ名」という名前が付けられます。
这次到此为止。