A. php中的介面是指什麼
介面interface是一個規定,給人繼承用的東西,有點像抽象類。
介面定義了實現某種服務的一般規范,聲明了所需的函數和常量,但不指定如何實現。之所以不給出實現的細節,是因為不同的實體可能需要用不同的方式來實現公共的方法定義。關鍵是要建立必須實現的一組一般原則,只有滿足了這些原則才能說實現了這個介面。
(1)phptrait單例擴展閱讀
PHP介面(interface)的特點 :
1、介面的方法必須是公開的。
2、介面的方法默認是抽象的,所以不在方法名前面加abstract。
3、介面可以定義常量,但不能定義成員屬性,常量的定義和用法和類中常量一樣。
4、類可以實現多個介面(相當於把多個功能集於一身,如手機實現了小靈通、MP3、MP4的功能)
5、介面也可以繼承介面。
PHP同大多數的面向對象語言一樣,並不支持多重繼承。如果需要實現多重繼承功能,在PHP中,可以通過介面,它是PHP解決多重繼承問題的方法,在php5.4版本之後有個類的新特性trait,有興趣的可以網路下。
B. thinkphp3.2以上版本 怎麼獲取數據主鍵
5.0版本和之前版本的差異較大,本篇對熟悉3.2版本的用戶給出了一些5.0的主要區別。 URL和路由 5.0的URL訪問不再支持普通URL模式,路由也不支持正則路由定義,而是全部改為規則路由配合變數規則(正則定義)的方式: 主要改進如下; 增加路由變數規則; 增加組合變數支持; 增加資源路由; 增加路由分組; 增加閉包定義支持; 增加MISS路由定義; 支持URL路由規則反解析; 請求對象和響應對象 5.0新增了請求對象Request和響應對象Response,Request統一處理請求和獲取請求信息,Response對象負責輸出客戶端或者瀏覽器響應。 模塊和控制器 控制器的命名空間有所調整,並且可以無需繼承任何的控制器類。 應用命名空間統一為app(可定義)而不是模塊名; 控制器的類名默認不帶Controller後綴,可以配置開啟use_controller_suffix參數啟用控制器類後綴; 控制器操作方法採用return方式返回數據 而非直接輸出; 廢除原來的操作前後置方法; 增加beforeActionList屬性定義前置操作; 支持任意層次的控制器定義和訪問; URL訪問支持自動定位控制器; 資料庫 5.0的資料庫查詢功能增強,原先需要通過模型才能使用的鏈式查詢可以直接通過賀仔山Db類調用,原來的M函數調用可以改用db函數,例如: 3.2版本 M('User')->where(['name'=>'thinkphp'])->find(); 5.0版本 db('User')->where('name','thinkphp')->find(); 主要改進戚扒如下: 支持鏈式查詢操作; 數據查詢支持返回對象、數組和PDOStatement對象; 數據集查詢支持返回數組和Collection對象; 增加查詢構造器,查詢語法改變; 支持閉包查詢; 支持分塊查詢; 支持視圖查詢; 增加SQL監聽事件; 模型 5.0的模型變化是最大的,基本上模型是完全面向對象的概念,包括關聯模型,模型類的後綴不再帶Model,直接由命名空間區分,原來的D函數調用改為model函數,並且必須創建對應的模型類,例如: 3.2版本 D('User')->where(['name'=>'thinkphp'])->find(); 5.0版本 model('User')->where('name','thinkphp')->find(); 主要改進包括: 重構關聯模型; 支持聚合模型; 廢除視圖模型(改為資料庫的視圖查詢方法); 模型的擴展採用Trait機制; 增加獲取器和修改器; 增加時間戳自動寫入; 增加類型欄位轉換; 數組訪問支持; JSON序列化支持; 自動驗證和自動完成 5.0的數據自動驗證和自動完成和3.2版本區別較大,5.0的數據驗證採用驗證器定義並且通過think\Validate類進行統一的驗證。自動完成則通過在模型裡面定義修改器來完成。 異常 5.0對錯誤零容忍,默認情況下會對任何級別的錯誤拋出異常(但可以在應禪中用公共文件中設置錯誤級別),並且重新設計了異常頁面,展示了詳盡的錯誤信息,便於調試。 調試和日誌 5.0的頁面Trace強化,支持瀏覽器控制台查看Trace信息。 5.0的日誌驅動增加Socket方式,採用SocketLog支持遠程調試。 常量 5.0版本廢棄了原來的大部分常量定義,僅僅保留了框架的路徑常量定義,其餘的常量可以使用App類或者Request類的相關屬性或者方法來完成,或者自己重新定義需要的常量。 廢除的常量包括: REQUEST_METHOD IS_GET IS_POST IS_PUT IS_DELETE IS_AJAX __EXT__ COMMON_MODULE MODULE_NAME CONTROLLER_NAME ACTION_NAME APP_NAMESPACE APP_DEBUG MODULE_PATH 函數 5.0版本核心框架不依賴任何自定義函數,但仍然封裝了一些常用功能到助手函數,你可以隨意重新定義或者增加助手函數。
C. php中的類是單繼承,那要有多個類繼承怎麼辦
PHP沒有多繼承的特性。即使是一門支持多繼承的編程語言,我們也很少會使用這個特性。在大多數人看來,多繼承不是一種好的設計方法。想要給某個類添加額外的特性,不一定要使用繼承。這里我提供一種模擬多繼承的方法以供參考。
PHP有一個魔術方法,叫做__call。當你調用一個不存在的方法時,這個方法會被自動調用。這時,我們就有機會將調用重定向到一個存在的方法。繼承多個父類的子類,尋找方法的過程一般是這樣的:
本身的方法 -> 父類1的方法 -> 父類2的方法...
模擬過程大致是這樣:將各個父類實例化,然後作為子類的屬性。這些父類提供一些公有的方法。當子類擁有某方法時,__call()函數不會被調用。這相當於「覆蓋」了父類的方法。當調用了不存在的方法時,通過__call()方法依次從父類中尋找可以調用的方法。雖然這不是完備的多繼承,但可以幫助我們解決問題。
<?php
classParent1{
functionmethod1(){}
functionmethod2(){}
}
classParent2{
functionmethod3(){}
functionmethod4(){}
}
classChild{
protected$_parents=array();
publicfunctionChild(array$parents=array()){
$_parents=$parents;
}
publicfunction__call($method,$args){
//從「父類"中查找方法
foreach($this->_parentsas$p){
if(is_callable(array($p,$method))){
returncall_user_func_array(array($p,$method),$args);
}
}
//恢復默認的行為,會引發一個方法不存在的致命錯誤
returncall_user_func_array(array($this,$method),$args);
}
}
$obj=newChild(array(newParent1(),newParent2()));
$obj->method1();
$obj->method3();
這里沒有涉及屬性的繼承,但實現起來並不困難。可以通過__set()和__get()魔術方法來模擬屬性的繼承。請你動手實踐。
D. PHP魔術常量__DIR__備忘
概述:本文簡要討論在TP5.0中定義目錄常量時,用到的PHP魔術常量簡模__DIR__的含義及其它相關的用法。
截止到PHP7.4,通過官行亂方手冊查知,目前PHP一共有八個魔術常量,分別為:__LINE__,__FILE__,__DIR__,__FUNCTION__,__CLASS__,__TRAIT__,__METHOD__,__NAMESPACE__。
__DIR__ 是其中用的比較頻繁的一個,含義為:文件所在的目錄(如果用在被包括文件中,則返回被包括的文件所在的目錄。它等價於 dirname(__FILE__) 。除非是根目錄,否則目錄中名不包括末尾的斜杠。),說的直白一攔帶緩點就是,它返回的是:這個常量所在的文件的絕對路徑。
單獨看定義可能不是很好理解,下面舉兩個例子進行說明,假設使用windows操作系統,已部署好站點在c:\wwwroot\目錄。
示例1: 在網站根目錄有1.php,訪問/1.php時:
在1.php輸入 var_mp(__DIR__),則輸出為: C:\wwwroot
示例2: 在網站根目錄有1.php,另有文件夾a,在a下面有b.php,在1.php包含了訪問a/b.php時:
在b.php輸入 var_mp(__DIR__),則輸出為: C:\wwwroot\a
另: 使用 dirname($_SERVER['SCRIPT_FILENAME']) 也可以獲取文件目錄,不過$_SERVER['SCRIPT_FILENAME']返回的是訪問文件的路徑,即上面兩個示例都會返回C:/wwwroot/1.php,注意在windows系統下返回的路徑分隔符也有區別。
E. 計算機英語中trait什麼意思
不錯,trait本身是特指,特性、特徵。 但和計算機相關的trait是指電腦程序設計語言中的trait,也即:通過定義一組方法,使用簡檔悉如化的模型概念來實現面向對象的程序設計。 很多電行啟腦設計語言,比如Fortress、Scala、Objective-C、Perl、PHP, Ruby, 當然還有C++都支持稱之為「特性定義及陸判萃取」的trait技術。
F. php trait 如何重寫變數
<form action="traitcheck.asp?Pname=variable"> 假好塵設則差"variable"孫襪皮是變數...
G. php中trait 多繼承 成員屬性一樣怎麼代替
class myClass{
use myTrait;
}
$obj = new myClass();
$obj->traitMethod1();
$obj->traitMethod2();
// ↓↓ 只能調用public的屬性和方法; protected以及private只供在traits內部自己調用;
echo $obj->traitPublic;
優先余旁級問題
Trait會覆蓋繼承的方法,當前類陵燃會覆蓋Trait方法。即 繼承的尺毀虛方法 < Traits方法 < 當前類方法,
trait A{
public $var1 = 'test';
public function test()
{
echo 'A::test()';
}
public function test1()
{
H. 什麼是psr-0,psr-1,psr-2標准
轉自:http://www.nginx.cn/2677.html
FIG組織在制定跟PHP相關規范,簡稱PSR,PSR旨在通過討論我們代碼項目的共同點以找出一個協作編程的方法。
什麼是psr0強調自動載入的方式
下文描述了若要使用一個通用的自動載入器(autoloader),你所需要遵守的規范:
規范
一個完全標準的命名空間(namespace)和類(class)的結構是這樣的:\*
每個命名空間(namespace)都必須有一個頂級的空間名(namespace)("組織名(Vendor Name)")。
每個命名空間(namespace)中可以根據需要使用任意數量的子命名空間(sub-namespace)。
從文件系統中載入源文件時,空間名(namespace)中的分隔符將被轉換為 DIRECTORY_SEPARATOR。
類名(class name)中的每個下劃線_都將被轉換為一個DIRECTORY_SEPARATOR。下劃線_在空間名(namespace)中沒有什麼特殊的意義。
完全標準的命名空間(namespace)和類(class)從文件系統載入源文件時將會加上.php後綴。
組織名(vendor name),空間名(namespace),類名(class name)都由大小寫字母組合而成。
示例
\Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
\Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
\Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
空間名(namespace)和類名(class name)中的下劃線
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
以上是我們為實現通用的自動載入而制定的租野最低標准。你可以利用能夠自動載入PHP 5.3類的SplClassLoader來測答型族試你的代碼是否符合這些標准。
實例
下面是一個怎樣利用上述標准來實現自動載入的示例函數。
<?php
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
SplClassLoader實現清弊
下面的gist是一個按照上面建議的標准來自動載入類的SplClassLoader實例。這是依據這些標准來載入PHP 5.3類的推薦方案。
什麼是psr1,定義基本代碼規范
本節我們將會討論一些基本的代碼規范問題,以此作為將來討論更高級別的代碼分享和技術互用的基礎。
RFC 2119中的必須(MUST),不可(MUST NOT),建議(SHOULD),不建議(SHOULD NOT),可以/可能(MAY)等關鍵詞將在本節用來做一些解釋性的描述。
1. 概述
源文件必須只使用 和 這兩種標簽。
源文件中php代碼的編碼格式必須只使用不帶位元組順序標記(BOM)的UTF-8。
一個源文件建議只用來做聲明(類(class),函數(function),常量(constant)等)或者只用來做一些引起副作用的操作(例如:輸出信息,修改.ini配置等),但不建議同時做這兩件事。
命名空間(namespace)和類(class) 必須遵守PSR-0標准。
類名(class name) 必須使用駱駝式(StudlyCaps)寫法 (譯者註:駝峰式(cameCase)的一種變種,後文將直接用StudlyCaps表示)。
類(class)中的常量必須只由大寫字母和下劃線(_)組成。
方法名(method name) 必須使用駝峰式(cameCase)寫法(譯者註:後文將直接用camelCase表示)。
2. 文件
2.1. PHP標簽
PHP代碼必須只使用長標簽()或者短輸出式標簽(<?= ?>);而不可使用其他標簽。
2.2. 字元編碼
PHP代碼的編碼格式必須只使用不帶位元組順序標記(BOM)的UTF-8。
2.3. 副作用
一個源文件建議只用來做聲明(類(class),函數(function),常量(constant)等)或者只用來做一些引起副作用的操作(例如:輸出信息,修改.ini配置等),但不建議同時做這兩件事。
短語副作用(side effects)的意思是 在包含文件時 所執行的邏輯與所聲明的類(class),函數(function),常量(constant)等沒有直接的關系。
副作用(side effects)包含但不局限於:產生輸出,顯式地使用require或include,連接外部服務,修改ini配置,觸發錯誤或異常,修改全局或者靜態變數,讀取或修改文件等等
下面是一個既包含聲明又有副作用的示例文件;即應避免的例子:
<?php
// 副作用:修改了ini配置
ini_set('error_reporting', E_ALL);
// 副作用:載入了文件
include "file.php";
// 副作用:產生了輸出
echo "<html>\n";
// 聲明
function foo()
{
// 函數體
}
下面是一個僅包含聲明的示例文件;即應提倡的例子:
<?php
// 聲明
function foo()
{
// 函數體
}
// 條件式聲明不算做是副作用
if (! function_exists('bar')) {
function bar()
{
// 函數體
}
}
3. 空間名(namespace)和類名(class name)
命名空間(namespace)和類(class)必須遵守 PSR-0.
這意味著一個源文件中只能有一個類(class),並且每個類(class)至少要有一級空間名(namespace):即一個頂級的組織名(vendor name)。
類名(class name) 必須使用StudlyCaps寫法。
PHP5.3之後的代碼必須使用正式的命名空間(namespace) 例子:
<?php
// PHP 5.3 及之後:
namespace Vendor\Model;
class Foo
{
}
PHP5.2.x之前的代碼建議用偽命名空間Vendor_作為類名(class name)的前綴
<?php
// PHP 5.2.x 及之前:
class Vendor_Model_Foo
{
}
4. 類的常量、屬性和方法
術語類(class)指所有的類(class),介面(interface)和特性(trait)
4.1. 常量
類常量必須只由大寫字母和下劃線(_)組成。 例子:
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
}
4.2. 屬性
本指南中故意不對$StulyCaps,$camelCase或者$unser_score中的某一種風格作特別推薦,完全由讀者依據個人喜好決定屬性名的命名風格。
但是不管你如何定義屬性名,建議在一個合理的范圍內保持一致。這個范圍可能是組織(vendor)級別的,包(package)級別的,類(class)級別的,或者方法(method)級別的。
4.3. 方法
方法名則必須使用camelCase()風格來聲明。
什麼是PSR2定義代碼風格
代碼風格指南
本手冊是基礎代碼規范(PSR-1)的繼承和擴展。
為了盡可能的提升閱讀其他人代碼時的效率,下面例舉了一系列的通用規則,特別是有關於PHP代碼風格的。
各個成員項目間的共性組成了這組代碼規范。當開發者們在多個項目中合作時,本指南將會成為所有這些項目中共用的一組代碼規范。 因此,本指南的益處不在於這些規則本身,而在於在所有項目中共用這些規則。
RFC 2119中的必須(MUST),不可(MUST NOT),建議(SHOULD),不建議(SHOULD NOT),可以/可能(MAY)等關鍵詞將在本節用來做一些解釋性的描述。
I. thinkphp6app控制器文件夾小寫
ThinkPHP6正確的命名規范如下
目錄和文件
1,目錄使用小寫+下劃線: admin_manage
2,類庫、函數文件統一以.php為後綴: common.php
3,類的文件名均以命名空間定義,並且命名空間的路徑和類庫文件所在路徑一致, 這是自動載入的機制要求
4,類(包含介面和Trait)文件採用駝峰法命名(首字母大寫),其它文件採用小寫+下劃線命名: user_email
5,類名(包含介面和Trait)和類文件名保持一致,統一採用駝峰法命名: StaffController.php
函數和類、屬性命名州裂
1,類的命名採用駝峰法(首字母大寫),默認不需要添加後綴,例如:User、UserType
2,函數的命名使用小寫字母和下劃線(小寫字母開頭)的方式,例如:get_client_ip
3,方法的命名使用駝峰法(首字母小寫),例如:getUserName
4,屬性的命名使用駝峰法(首字母小寫),例如:tableName、instance
5,特例:以雙下劃線__打頭的函數或方法作為魔術方法,例如:__call和__autoload
常量和配置
1,常量以大寫字母和冊神閉下劃線命名,例如:APP_PATH
2,配置參數以小寫字母和下劃線命名,例如:url_route_on 和 url_convert
3,環境變數定義使用大寫字母和下劃線命名,例如:APP_DEBUG
數據表和欄位
數據表和欄位採用小寫加下劃線方式命名,並注意欄位名不要以下劃瞎枯線開頭
J. php 5.4 的 trait 怎麼用在3.2.2中
感覺 php 5.4 的 trait 和 java 的 interface 非常像!很好的代敏差碼復用機制。但是不知道橋洞皮怎麼在 ThinkPHP 3.2.2 或者 OneThink 中使用。。。應該要加命名空間吧,那如何載入呢?放Common模塊下顫碰?