php如何在一個類中引入另外一個類
有時候需要在一個類中調用另外一個類裏面的方法,然後另外一個類又需要調用當前類的方法,怎麼辦呢?下面是具體的介紹。希望對大家有用,更多內容請關注應屆畢業生網!
可以直接引入類對象的方式調用另外一個類的方法示例如下(傳值方式)
class a {
function b($obj) {
$obj->test();
}
}
class b {
function test() {
echo 'test';
}
}
$a = new a();
$b->b(new b());
繼承的方式,如果子類中定義了相同的方法 將會覆蓋父類的方法
class b {
function __construct(){
}
function testb(){
echo 'test';
}
}
class a extends b {
function __construct(){
parent::testb();
//or like this
$this->testb();
}
//重複定義 將會覆蓋
function testb(){
echo 123;
}
}
$a = new a();
【拓展閲讀】PHP7擴展開發之數組處理
前言:這次,我們將演示如何在PHP擴展中如何對數組進行處理。要實現的PHP代碼如下:
1234567891011121314151617181920212223 | <?php function array_concat ( $arr , $prefix ) {
foreach ( $arr as $key => $val ) {
if (isset( $prefix [ $key ])
&& is_string ( $val )
&& is_string ( $prefix [ $key ])) {
$arr [ $key ] = $prefix [ $key ]. $val ;
}
}
return $arr ; } $arr = array (
0 => '0' ,
1 => '123' ,
'a' => 'abc' , ); $prefix = array (
1 => '456' ,
'a' => 'def' , ); var_dump(array_concat( $arr , $prefix )); ?> |
把兩個數組,相同key的字符串值拼接。
代碼奉上:
基礎代碼
這個擴展,我們將在say擴展上增加 array_concat 方法。say擴展相關代碼大家請看這篇文章。PHP7擴展開發之hello word 文中已經詳細介紹瞭如何創建一個擴展和提供了源碼下載。
實現array_concat方法
array_concat方法的PHP擴展源碼:
12345678910111213141516171819202122232425262728293031323334353637 | PHP_FUNCTION(array_concat) {
zval *arr, *prefix, *entry, *prefix_entry, value;
zend_string *string_key, *result;
zend_ulong num_key;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "aa" , &arr, &prefix) == FAILURE) {
return ;
}
array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(arr)));
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(arr), num_key, string_key, entry) {
if (string_key && zend_hash_exists(Z_ARRVAL_P(prefix), string_key)) {
prefix_entry = zend_hash_find(Z_ARRVAL_P(prefix), string_key);
if (Z_TYPE_P(entry) == IS_STRING && prefix_entry != NULL && Z_TYPE_P(prefix_entry) == IS_STRING) {
result = strpprintf(0, "%s%s" , Z_STRVAL_P(prefix_entry), Z_STRVAL_P(entry));
ZVAL_STR(&value, result);
zend_hash_update(Z_ARRVAL_P(return_value), string_key, &value);
}
} else if (string_key == NULL && zend_hash_index_exists(Z_ARRVAL_P(prefix), num_key)){
prefix_entry = zend_hash_index_find(Z_ARRVAL_P(prefix), num_key);
if (Z_TYPE_P(entry) == IS_STRING && prefix_entry != NULL && Z_TYPE_P(prefix_entry) == IS_STRING) {
result = strpprintf(0, "%s%s" , Z_STRVAL_P(prefix_entry), Z_STRVAL_P(entry));
ZVAL_STR(&value, result);
zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, &value);
}
} else if (string_key) {
zend_hash_update(Z_ARRVAL_P(return_value), string_key, entry);
zval_add_ref(entry);
} else {
zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry);
zval_add_ref(entry);
}
}ZEND_HASH_FOREACH_END(); } |
代碼説明
PHP中的數組本質上就是一個哈希。
對於哈希處理的方法主要集中在Zend/zend_hash.h中。
對於數組的操作方法主要集中在Zend/API.h。數組的方法其實就是對哈希處理方法的一層包裝。
數組操作的方法主要是以add_assoc_ 和 add_index_開頭的一些列方法。
下面是代碼中涉及的一些方法。
zend_hash_num_elements獲取數組的元素個數。
array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(arr))); 初始化一個數組。在PHP擴展中,我們是通過return_value這個變量設置方法的返回值。因此,我們直接修改這個return_value變量即可。感興趣的話,可以把宏方法PHP_FUNCTION展開看下。
PHP7提供了一套宏方法用於遍歷哈希和對哈希進行操作。這些宏方法主要放在Zend/zend_hash.h文件中。如,代碼中的ZEND_HASH_FOREACH_KEY_VAL就是一個變量哈希的宏。是不是和PHP代碼中的foreach有點像?
在這裏我們把代碼中用到的哈希相關的.方法做下整理説明:
ZEND_HASH_FOREACH_KEY_VAL 和 ZEND_HASH_FOREACH_END 配合使用,實現foreach的效果。
zend_hash_exists 檢測指定的key在哈希中是否存在。key為字符串。
zend_hash_index_exists 檢測指定的key在哈希中是否存在。key為數字。
zend_hash_find 根據key查找指定的值。key為字符串。
zend_hash_index_find 根據key查找指定的值。key為數字。
zend_hash_update 更新指定key的值。key為字符串。
zend_hash_index_update 更新指定key的值。key為數字。
基本上有這些方法,你就可以對數組進行一些基本操作了。方法命名也很有規律,key為字符串和數字提供了兩套。
zval_add_ref(entry); 給數組的值,增加一次引用計數。zend_hash_update方法只自動給string_key自動增加了一次引用計數。數組return_value共用數組arr的值。因此,我們需要手動增加一次引用計數。
-
提高PHP執行效率的50個技巧
PHP是一種HTML內嵌式的語言,是一種在服務器端執行的嵌入HTML文檔的腳本語言,下面是小編為大家整理的提高PHP執行效率的50個技巧,歡迎參考~1、用單引號代替雙引號來包含字符串,這樣做會更快一些。因為PHP會在雙引號包圍的字符串中搜尋變量,單引號則不會,注意:只有echo...
-
PHP中用CURL偽造IP來源的方法
PHP中用CURL偽造IP來源的.方法,有需要的朋友可以看看。就跟隨本站小編一起去了解下吧,想了解更多相關信息請持續關注我們應屆畢業生考試網!1.文件複製代碼代碼如下:<?php$ch=curl_init();curl_setopt($ch,CURLOPT_URL,"http://localhost/");curl_setopt($ch,CURL...
-
ini函數解析
PHP獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。以下是小編為大家搜索整理的ini函數解析,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!t、ini_get_all、ini_restore。個人感覺最有用的就...
-
作為程序員必知的16個最佳PHP庫
PHP是一種功能強大的web站點腳本語言,通過PHP,web網站開發者可以更容易地創建動態的引人入勝的web頁面。開發人員可以使用PHP代碼與一些網站模板和框架來提升功能和特性。然而,編寫PHP代碼是一個繁瑣又耗時的過程。為了縮短開發時間,開發人員可以用PHP庫替代編寫代...