- 相關(guān)推薦
php如何在一個(gè)類中引入另外一個(gè)類
有時(shí)候需要在一個(gè)類中調(diào)用另外一個(gè)類里面的方法,然后另外一個(gè)類又需要調(diào)用當(dāng)前類的方法,怎么辦呢?下面是具體的介紹。希望對(duì)大家有用,更多內(nèi)容請(qǐng)關(guān)注應(yīng)屆畢業(yè)生網(wǎng)!
可以直接引入類對(duì)象的方式調(diào)用另外一個(gè)類的方法示例如下(傳值方式)
class a {
function b($obj) {
$obj->test();
}
}
class b {
function test() {
echo 'test';
}
}
$a = new a();
$b->b(new b());
繼承的方式,如果子類中定義了相同的方法 將會(huì)覆蓋父類的方法
class b {
function __construct(){
}
function testb(){
echo 'test';
}
}
class a extends b {
function __construct(){
parent::testb();
//or like this
$this->testb();
}
//重復(fù)定義 將會(huì)覆蓋
function testb(){
echo 123;
}
}
$a = new a();
【拓展閱讀】PHP7擴(kuò)展開發(fā)之?dāng)?shù)組處理
前言:這次,我們將演示如何在PHP擴(kuò)展中如何對(duì)數(shù)組進(jìn)行處理。要實(shí)現(xiàn)的PHP代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?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 )); ?> |
把兩個(gè)數(shù)組,相同key的字符串值拼接。
代碼奉上:
基礎(chǔ)代碼
這個(gè)擴(kuò)展,我們將在say擴(kuò)展上增加 array_concat 方法。say擴(kuò)展相關(guān)代碼大家請(qǐng)看這篇文章。PHP7擴(kuò)展開發(fā)之hello word 文中已經(jīng)詳細(xì)介紹了如何創(chuàng)建一個(gè)擴(kuò)展和提供了源碼下載。
實(shí)現(xiàn)array_concat方法
array_concat方法的PHP擴(kuò)展源碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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中的數(shù)組本質(zhì)上就是一個(gè)哈希。
對(duì)于哈希處理的方法主要集中在Zend/zend_hash.h中。
對(duì)于數(shù)組的操作方法主要集中在Zend/API.h。數(shù)組的方法其實(shí)就是對(duì)哈希處理方法的一層包裝。
數(shù)組操作的方法主要是以add_assoc_ 和 add_index_開頭的一些列方法。
下面是代碼中涉及的一些方法。
zend_hash_num_elements獲取數(shù)組的元素個(gè)數(shù)。
array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(arr))); 初始化一個(gè)數(shù)組。在PHP擴(kuò)展中,我們是通過return_value這個(gè)變量設(shè)置方法的返回值。因此,我們直接修改這個(gè)return_value變量即可。感興趣的話,可以把宏方法PHP_FUNCTION展開看下。
PHP7提供了一套宏方法用于遍歷哈希和對(duì)哈希進(jìn)行操作。這些宏方法主要放在Zend/zend_hash.h文件中。如,代碼中的ZEND_HASH_FOREACH_KEY_VAL就是一個(gè)變量哈希的宏。是不是和PHP代碼中的foreach有點(diǎn)像?
在這里我們把代碼中用到的哈希相關(guān)的方法做下整理說明:
ZEND_HASH_FOREACH_KEY_VAL 和 ZEND_HASH_FOREACH_END 配合使用,實(shí)現(xiàn)foreach的效果。
zend_hash_exists 檢測指定的key在哈希中是否存在。key為字符串。
zend_hash_index_exists 檢測指定的key在哈希中是否存在。key為數(shù)字。
zend_hash_find 根據(jù)key查找指定的值。key為字符串。
zend_hash_index_find 根據(jù)key查找指定的值。key為數(shù)字。
zend_hash_update 更新指定key的值。key為字符串。
zend_hash_index_update 更新指定key的值。key為數(shù)字。
基本上有這些方法,你就可以對(duì)數(shù)組進(jìn)行一些基本操作了。方法命名也很有規(guī)律,key為字符串和數(shù)字提供了兩套。
zval_add_ref(entry); 給數(shù)組的值,增加一次引用計(jì)數(shù)。zend_hash_update方法只自動(dòng)給string_key自動(dòng)增加了一次引用計(jì)數(shù)。數(shù)組return_value共用數(shù)組arr的值。因此,我們需要手動(dòng)增加一次引用計(jì)數(shù)。
【php如何在一個(gè)類中引入另外一個(gè)類】相關(guān)文章:
php編寫的一個(gè)E-mail驗(yàn)證類08-26
PHP類與構(gòu)造函數(shù)07-01
PHP排序算法類講解07-18
PHP編程:類和對(duì)象、方法調(diào)用09-26
php學(xué)習(xí)筆記:類的聲明與對(duì)象實(shí)例化05-14
PHP學(xué)習(xí):QRCode PHP生成二維碼類庫10-28