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 数组和字符串互相转换实现方法
PHP数组和字符串互相转换是比较常用的,下面给大家介绍PHP数组和字符串互相转换实现方法,一起来了解一下吧!PHP数组和字符串互相转换实现方法PHP中由于数组和字符串这两种变量类型是如此常用,以至于PHP具有两个函数,可以在字符串和数组之间互相进行转换代码如下:$ar...
-
如何把PHP二进制与字符串之间的相互转换
PHP是一种HTML内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的`风格有类似于C语言,被广泛地运用。以下是小编为大家搜索整理的如何把PHP二进制与字符串之间的相互转换,希望能给大家带来帮助,更多精彩内容请及时关注我们应届毕业生考试网![代码]p...
-
在PHP中使用随机数的三个步骤
如何做一个随机的出现的网页,可是用rand()就是不行,听说要初始化随机数,可是怎么初始化,请不吝赐教,谢谢!//第一步:初始化种子$seedarray=microtime();$seedstr=split("",$seedarray,5);$seed=$seedstr[0]*10000;//第二步:使用种子初始化随机数发生器srand($seed);//...
-
PHP入门学习方法
每个人的学习方式不同,写这篇文章的目的是分享一下自己的学习过程,仅供参考,不要一味的用别人的学习方法,找对自己有用的学习方式,关于php语言怎么学呢?下面是相关的知识,欢迎阅读。其实学习一门新语言并不是太难,重要的是你有没有准备好去学好它,时间的长短和个人的能...