本篇文章為大家帶來了關於PHP中的相關知識,其中主要介紹了物件導向的相關問題,物件導向程式設計的本質是增加資料和功能的操作主體即對象,希望對大家有幫助。
推薦學習:《PHP教程》
實作學習php,thinkphp,Redis,vue,uni-app等技術,推薦開源電商系統likeshop,可以藉鏡思路,可去版權免費商用,gitee下載地址:
點擊進項目地址
面向對象:OOP(objected oriented programming)編程
面向過程是一種程式設計思想
物件導向程式設計的本質是增加資料和功能的操作主體,即物件
物件導向中的所有的資料和功能多是由主體(對象)來呼叫和操作
物件導向基礎
面向過程和物件導向區別
物件導向關鍵字
- 物件:object,某一類別事務的具體代表,又稱為實例
- 實例化:new,類別產生物件的過程
- 類別成員:member
- 建立物件
<?phpclass People{}$man=new People();# 实例化类,man就是对象var_dump($man);?> # 输出object(People)#1 (0) { } #1表示:对象编号,与类无关,是整个脚本中对象的序号(0)表示:成员变量(属性)个数{}表示:具体成员变量信息(键值对)
類別物件<?phpclass Buyer{ # 常量声明 const BIG_NAME='BUYER'; # 常量不需要加 $ # 属性声明 # $name; # 错误的,类内部属性必须使用访问修饰限定符 public $name; public $money=0; # 方法声明 function display(){ echo __CLASS__; # 魔术常量,输出类名 # 方法内部变量属于局部变量 }}# 实例化$a = new Buyer();# 属性操作,增删改查echo $a->money;$a->money='20';$a->sex='male';unset($a->name);echo '<br>';# 方法操作$a->display();echo '<br>';var_dump($a);?> # 输出0Buyerobject(Buyer)#1 (2) { ["money"]=> string(2) "20" ["sex"]=> string(4) "male" }
注意:類別常數不是由物件進行存取
#存取修飾限定符
在屬性或方法前的修飾關鍵字,用來控制屬性或方法的存取位置
public:公有,類別內和類別外都可以存取
private:私有,只允許在定義類別內部存取
- 類別內部物件$this,方法內部內建的一個對象,會自動指向來呼叫的方法的物件
- $this 存在於方法內部(僅限內部使用),所以相當於在類別的結構內部 可以存取任意存取修飾限定符修飾的成員
#私有成員都是透過公有方法來實現存取(公有方法可以在類別外部存取)
<?phpclass Article{ protected $name = 'a'; private $type = 'art'; public function get_name() { var_dump($this); }}$a = new Article();var_dump($a);?> # 输出object(Article)#1 (2) { ["name:protected"]=> string(1) "a" ["type:private"]=> string(3) "art" }
- #建構方法
- __construct() 是一種系統內建的魔術方法,該方法的特性是在物件實例化之後,物件立即自動呼叫
建構方法的目的就是為了初始化資源,包括物件屬性和其他資源
#一旦建構方法定義好後,且建構方法自帶參數,那麼就只能使用new 類別名稱(參數列表) 方式才能正確實例化
魔術方法也可以透過物件直接調用的方式調用,不過沒有實際用處
<?phpclass Article{ public $name='xiaoli'; private $sex="male"; public function __construct($name,$sex) { $this->name = $name; $this->sex = $sex; }}$a = new Article('xiaowang', 'famale');var_dump($a);?>
析構方法
__destruct(),物件在被銷毀時自動調用,釋放資源- 物件銷毀物件無變量指向(變數指向其他資料)
- 物件被主動銷毀(unset銷毀物件變數)腳本執行結束(自動釋放資源)
- PHP腳本執行結束會釋放所有資源,所以一般較少用析構方法
<?phpclass Article{ protected $name = 'xiaoli'; private $sex = 'famale'; public function __destruct() { // TODO: Implement __destruct() method. echo __FUNCTION__; }}$a=new Article();# 销毁对象$a=1;unset($a);# __destructendecho 'end';?> # 不销毁对象,php在运行结束也会释放资源# end__destruct
物件傳值
###定義:將保存物件的變數賦值給另一個變數### ###在PHP 中,物件的傳值是引用傳遞:即一個物件變數賦值給另外一個變量,兩個變數指向同一個物件位址,即只有一個物件###<?phpclass Article{ public $name = 'xiaoli'; public $sex = 'famale';}$a=new Article();$b=$a;var_dump($a,$b);echo '<br>';$a->name="wangxiaohu";var_dump($a,$b);echo '<br>';?> # 输出object(Article)#1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" } object(Article) #1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" }object(Article) #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" } object(Article) #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" }###範圍解析運算子(類別常數存取)######有兩個冒號組成「::」 ,專門用於###類別實現類別成員操作###,可以實現類別直接存取類別成員######## ####範圍解析運算子是用來給類別(類別名稱)存取類別成員使用的###
类名::类成员#########範圍解析運算子也可以被物件用來當作類別使用(不建議)###
$对象名::类成员#########類別常數只能被類別存取#########
<?phpclass Article{ const NAME='ocean';}echo Article::NAME; # 常量是不能通过 Article->NAME 来进行访问的$a=new Article();echo $a::NAME; # 范围解析操作符兼容对象,找到对象所属类最终进行访问,效率降低,灵活性提高?>###類別常數是固定的,而物件的屬性是不同物件不同的###
静态成员
定义:使用 static 关键字修饰的类成员,表示该成员属于类访问
- 静态成员
- 静态属性
- 静态方法
- 静态成员是明确用来给类访问的,而不是对象
- 静态成员只是多了一个 static 关键字修饰,本身也可以被对象访问
- 静态成员同样可以使用不同的访问修饰限定符限定,效果一致
<?phpclass Article{ public static $name = 'hlm'; public static $type = 'art'; public static function getName() { return self::$name; }}# 静态属性$a = new Article();echo Article::$name;# 静态方法echo Article::getName();?>
self关键字
- 在类的内部(方法里面)使用,代替类名的写法
- self 如同 $this 代表内部对象一样,能够在方法内部代替当前类名
- 能够保障用户方便修改类名字
- self 关键字是代替类名,所以需要配合范围解析操作符 ::
<?phpclass Article{ public static function getInstance1() { return new self(); } public static function getInstance2() { return new Article(); }}$a = Article::getInstance1();$b = Article::getInstance2();var_dump($a,$b);?> # 输出object(Article) #1 (0) { } object(Article) #2 (0) { }
类加载
类的访问必须保证类在内存中已经存在,所以需要再用类之前将类所在的 PHP 文件加载到内存中
-
类的加载分为两种
- 手动加载:在需要使用类之间通过 include 将包含类的文件引入到内存
- 自动加载:提前定义好类结构和位置,写好引入类文件代码,在系统需要类而内存不存在的时候想办法让写好的加载类的代码执行(自动加载是自动运行写好的加载类的代码)
-
自动加载两种方式
- 魔术函数 __autoload:系统自动调用,需要传入类名,在函数内部实现类的手动加载(PHP7及之后不建议使用此方法)
function __autoload($classname){ # 找到对应的文件路径和命名规范,手动加载}
- 自定义函数:自己定义类的加载实现,然后通过 spl_autoload_register 注册到自动加载机制(可注册多个自动加载)
# 自定义类加载函数function 自定义函数($classname){ # 找到对应的文件和命名规范,手动加载}#注册自动加载sql_autoload_register('自定义函数名字')
自动加载要求在声明类的时候有良好的规范
- 类名与文件名一致:类名.php 或者 类名.class.php
- 类文件分类放好
例:手动加载
Article.php
<?phpclass Article{ public function getName(){ return __METHOD__; }}
mian.php
<?php # include 'Article.php';# 直接加载比较消耗资源,而且如果类已经在内存中存在,直接include会报错,建议判断后再加载if(!class_exists('Article')){ include 'Article.php';}$a=new Article();var_dump($a->getName()); # outputstring(16) "Article::getName"
自动加载
- __autoload(不建议使用)
一个系统中,可能类文件会放到不同的路径下,因此一个完整的自动加载函数,应该要进行文件判定功能
<?php function __autoload($classname){ # 形参代指 类名 #组织文件路径,假设当前路径下,有两个文件夹下都有类c和类m $c_file = 'c/' . $classname . '.php'; if (file_exists($c_file)) { include_once($c_file); return true; } //if 语句如果只有一行不需要加 {} //include_once 只加载一次 $m_file = 'm/' . $classname . '.php'; if (file_exists($m_file)) { include_once($m_file); return true; } } $a=new Article(); $b=new Article();
- spl_autoload_register
<?phpfunction autoload01($classname){ if(!class_exists($classname)){ $file_name=$classname.'.php'; if(file_exists($file_name)) include_once $file_name; }}spl_autoload_register('autoload01');$a=new Article();
对象克隆
通过已有的对象复制一个新的同样的对象,但两者之间并非同一个对象
面向对象高级
面向对象三大特性
封装、继承、多态
类的封装
类的继承
inherit,子类合法拥有父类的某些权限
- 继承必须满足继承关系:即存在合理的包含关系
- 继承的本质是子类通过继承可以直接使用父类已经存在的数据和数据操作
- PHP 使用 extends 关键字表示继承
子类也称派生类
父类也称基类
# 父类class Human{}# 子类继承class Man extends Human{}
类的多态
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果
- 需要发生类的继承,同时出现方法的重写(override),即子类拥有与父类同名的方法
- 在实例化对象的时候让父类对象指向子类对象(强制类型,PHP不支持,PHP 弱类型很灵活)
- 结果:父类对象表现的子类对象的特点
—PHP继承—
<?phpclass Human{ public function show(){ echo __METHOD__; }}class Man extends Human{}$m=new Man;$m->show();
有限继承
子类在继承父类的成员时,并非继承所有内容,而是继承并使用父类部分内容
- PHP 中繼承的本質是物件繼承
- PHP 中繼承的內容:父類別所有公有成員、受保護成員和私有屬性,私有方法不能繼承
- 受保護(protected)成員專於繼承,可以在父類別或子類別內部存取
- 私有成員的存取只能在所屬類別中設定公有或受保護方法實作存取
- 構造方法和析構方法可以被子類別繼承,
重寫Override
#override,子類別中定義了與父類別重名的成員
parent 關鍵字
一種明確存取父類別成員的表達方式
#方法重寫後,存取呼叫的是子類別方法,如果想要存取父類別方法,可以透過在子類別方法中使用parent 來強制存取父類別方法
parent 不能用於存取父類別的屬性(靜態屬性可以)
PHP 繼承特點
- PHP 只能單繼承,只有一個父類(若繼承多個類,可以使用鍊式繼承)
- PHP 繼承中,只有私有方法不能繼承
- PHP 允許繼承父類別中的建構方法和析構方法
#靜態延遲綁定
- 介面不是類,但是與類別有類似的結構
- 介面不能實例化,類別可以實作介面
介面成員
介面成員只能有兩類- 介面常數:const
- 共有的介面方法(普通方法與靜態方法)
屬性重載
當物件存取不存在的或權限不夠的屬性的時候,自動觸發魔術方法讓程式碼不出錯屬性重載魔術方法- __get(屬性名稱):存取不存在或權限不夠的屬性時觸發
- ##__set(屬性名稱,屬性值) :設定不存在或權限不夠的屬性時觸發
- __isset(屬性名):判定不存在或權限不夠的屬性是觸發
- __unset(屬性名):刪除不存在或權限不夠的屬性時觸發
- __tostring(): 當當作字串
物件或類別存取不存在或者權限不夠的方法,自動觸發的魔術方法讓程式碼不出錯
- __cal(方法名,方法参数列表):调用不存在或者权限不够的方法时触发
- __callStatic(方法名,方法参数列表):调用不存在或者权限不够的静态方法时触发
对象遍历
将对象中的所有属性以键值对的形式取出并进行访问
对象是一种复合数据类型,对象中真正保存的内容是属性
对象的属性本质也是一种键值对关系:名字 = 值
对象遍历就是利用 foreach 对对象中的属性进行取出解析
-
对象遍历遵循访问修饰限定符的限定:即类外只能遍历所有共有属性
foreach(对象变量 as [属性名变量 =>] 属性值变量){ #属性名变量代表取出的每个属性的名字 #属性值变量代表取出的每个属性的值}
Iterator 迭代器
生成器
yield 关键字
设计模式
design pattern,是软件开发人员在软件开发过程中问题的解决方法
单例模式
singleton,是一种类的设计只会最多产生一个对象的设计思想
保证资源唯一性
工厂模式
。。。。。。
命名空间
namespace,指人为的将内存进行分隔,让不同内存区域的同名结构共存,从而解决在大型项目能出现重名结构问题
基础语法:
namespace 关键字定义空间
命名规则
字母、数字、下划线,不能以数字开头
命名空间必须写在所有代码之前,定义了一个,之后可以定义多个
子空间
subspace,即在已有空间之上,再在内部进行空间划分
子空间直接通过 namespace+路径符号 \ 实现
非限定名称
直接访问元素本身,代表当前所属空间(当前目录)
限定名称
使用空间名+原名,代表访问当前空间子空间(当前目录子目录)
完全限定名称
从根目录(全局空间)开始访问,使用 \ 作为全局空间开始符号(根目录)
全局空间元素访问:使用完全限定名称访问
命名空间引入
推荐学习:《PHP视频教程》
以上是歸納總結PHP物件基礎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。