PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】
作者:luyaran 发布时间:2023-11-21 07:25:59
本文实例讲述了PHP学习记录之面向对象(Object-oriented programming,OOP)基础。分享给大家供大家参考,具体如下:
在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象,然而在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等,我们来看下对象的三个主要特征:
对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
举个栗子,比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态,来看张图片感受下:
来看下面向对象的主要内容:
类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象 − 是类的实例。
成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
成员函数 − 定义在类的内部,可用于访问对象的数据。
继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
子类 − 一个类继承其他类称为子类,也可称为派生类。
多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
接下来,咱们通过通过 Car 类 创建了三个对象,Mercedes, Bmw, 和 Audi ,看下代码:
$mercedes = new Car ();
$bmw = new Car ();
$audi = new Car ();
看了代码是不是一脸懵,不要紧,咱们看下图片感受下:
到了这里呢,咱们对于对象有了一个简单的认知了已经,接下来咱们就看下这个类,PHP 定义类通常语法格式如下:
<?php
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
来看下文字解析:
类使用 class 关键字后加上类名定义。
类名后的一对大括号({})内可以定义变量和方法。
类的变量使用 var 来声明, 变量也可以初始化值。
函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。
来看下实例:
<?php
class Site {
/* 成员变量 */
var $url;
var $title;
/* 成员函数 */
function setUrl($par){
$this->url = $par;
}
function getUrl(){
echo $this->url . PHP_EOL;
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title . PHP_EOL;
}
}
?>
当类创建后,我们可以使用 new 运算符来实例化该类的对象,如下:
$luyaran = new Site;
$cuijinpeng = new Site;
通过以上代码,我们已经创建了两个对象,并且两个对象各自都是独立的,接下来我们来看看如何访问成员方法与成员变量。
首先,在实例化对象后,我们可以使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量,如下:
// 调用成员函数,设置标题和URL
$luyaran->setTitle( "luyaran" );
$cuijinpeng->setTitle( "cuijinpeng" );
$luyaran->setUrl( 'www.luyaran.com' );
$cuijinpeng->setUrl( 'www.cuijinpeng.com' );
// 调用成员函数,获取标题和URL
$luyaran->getTitle();
$cuijinpeng->getTitle();
$luyaran->getUrl();
$cuijinpeng->getUrl();
咱们接下来就要继续完善咱们刚刚创建的类了。
先来看构造函数,它是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。PHP 5 允许开发者在一个类中定义一个方法作为构造函数,语法格式如下:
void __construct ([ mixed $args [, $... ]] )
接下来我们来通过构造方法来初始化 $url 和 $title 变量,以晚上Site类,如下:
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
到了这里呢,我们如果要设置url和title值,就不需要再调用 setTitle 和 setUrl 方法了,具体设置方法如下:
$luyaran = new Site('www.luyaran.com', 'luyaran');
$cuijinpeng = new Site('www.cuijinpeng.com', 'cuijinpeng');
// 调用成员函数,获取标题和URL
$luyaran->getTitle();
$cuijinpeng->getTitle();
$google->getTitle();
$luyaran->getUrl();
$cuijinpeng->getUrl();
完事来看析构函数(destructor),它与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如下:
void __destruct ( void )
来看实例:
<?php
class MyDestructableClass {
function __construct() {
print "构造函数\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "销毁 " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
输出结果为:
构造函数
销毁 MyDestructableClass
咱们接下来就来看下类的继承。
PHP 使用关键字 extends 来继承一个类,但是PHP它不支持多继承,语法格式如下:
class Child extends Parent {
// 代码部分
}
咱们接下来使用Child_Site 类继承 Site 类,并扩展其功能,如下:
<?php
class Child_Site extends Site {
var $category;
function setCate($par){
$this->category = $par;
}
function getCate(){
echo $this->category . PHP_EOL;
}
}
再来看方法重写,它的定义就是,如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写,废话不多说,来看下重写了 getUrl 与 getTitle 方法的实例:
function getUrl() {
echo $this->url . PHP_EOL;
return $this->url;
}
function getTitle(){
echo $this->title . PHP_EOL;
return $this->title;
}
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的,来看下具体意思:
public(公有):公有的类成员可以在任何地方被访问。
protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有):私有的类成员则只能被其定义所在的类访问。
类属性必须定义为公有,受保护,私有之一,如果用 var 定义,则被视为公有,看实例感受下:
<?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以对 public 和 protected 进行重定义,但 private 而不能
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
echo $obj2->private; // 未定义 private
echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined
?>
类中的方法可以被定义为公有,私有或受保护,然而如果没有设置这些关键字,则该方法默认为公有,感受下实例:
<?php
/**
* Define MyClass
*/
class MyClass
{
// 声明一个公有的构造函数
public function __construct() { }
// 声明一个公有的方法
public function MyPublic() { }
// 声明一个受保护的方法
protected function MyProtected() { }
// 声明一个私有的方法
private function MyPrivate() { }
// 此方法为公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
$myclass->MyProtected(); // 这行会产生一个致命错误
$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有,受保护,私有都可以执行
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法为公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // 这行会产生一个致命错误
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
好啦,本次记录就到这里了。
希望本文所述对大家PHP程序设计有所帮助。
来源:https://blog.csdn.net/luyaran/article/details/82797460


猜你喜欢
- 最近开始使用Go/GoLand 在import 自定义包时出现各种状况,措手不及,大概在网上找了解决方法,几乎没说的清楚的(可能是我个人理解
- python的验证码库(captcha)将验证码做成这样:是不是和各大网页的图片源地址是一样,话不多说,让我们看代码:我是用django和p
- 数据类型描述CHARACTER(n)字符/字符串。固定长度 n。VARCHAR(n) 或 CHARA
- 我们在爬虫时,经常会遇见中文乱码问题,之前都是编码格式的问题,很少遇见由于压缩格式造成的编码混乱问题,特记录下。先看下混乱的编码样式。b
- 一、修改操作系统核心参数在Root用户下执行以下步骤:1)修改用户的SHELL的限制,修改/etc/security/limits.conf
- 对我当前工程进行全部测试需要花费不少时间。既然有 26 GB 空闲内存,为何不让其发挥余热呢? tmpfs 可以通过把文件系统保
- 实例如下:from win32com.client import Dispatch import win32com.client
- optimizer.param_groups: 是长度为2的list,其中的元素是2个字典;optimizer.param_groups[0
- 前言前几天切换了node版本,顺带着升级了npm,今天使用nodemon启动node环境时发现报错,提示未安装。没安装就安装了下,结果!冒出
- fetchone() 返回单个的元组,也就是一条记录(row),如果没有结果 则返回 Nonefetchall() 返回多个元组,即返回多个
- Python 模块安装一. 打开命令提示符win + R 输入 cmd 点击确定或者win + S 搜索输入 cmd二. 环境变量没有问题的
- 前言因为NLP作业需要用到kenlm,而kenlm在linux下更为方便。本人win10之前开启了子系统,所以就打算在子系统下进行相关作业的
- 从一个通道的图片进行卷积生成新的单通道图的过程很容易理解,对于多个通道卷积后生成多个通道的图理解起来有点抽象。本文以通俗易懂的方式讲述卷积,
- SQL SERVER支持的字符串函数内容:LEN(string)函数LOWER(string)函数UPPER (string)函数LTRIM
- MySQL在5.1引入了一个rename database操作,但在MySQL5.1.23后又不支持这个命令。可以说是一个实验性的功能,没有
- 大家好,今天分享一个实用的办公脚本:将多个PDF合并为一个PDF,例如我手上现在有如下3个PDF分册,需要整合成一个完整的PDF如果换成你操
- 觉得废话多的话,可以直接看代码作用防止有人不停的刷接口,对接口作限制比如说,登录接口,按道理说,应该只有app会请求这个接口但是,如果有人抓
- 分享一个用正则表达式校验电话号码、身份证号、日期格式、URL、Email等等格式的工具类package com.eabax.util;imp
- 一、Python函数中的参数1、使用python的函数时,有参数类别,比如位置参数、关键字参数、可变长参数2、位置参数、关键字参数很好理解,
- 一、问题描述SQL Server 的master数据库不能像其他用户或 系统数据库一样恢复, 因为没有活动的master数据库 SQL Se