php语言 百分网手机站

php如何在一个类中引入另外一个类

时间:2020-11-07 10:18:16 php语言 我要投稿

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代码如下:

 

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));
?>


  把两个数组,相同key的字符串值拼接。

  代码奉上:

  基础代码

  这个扩展,我们将在say扩展上增加 array_concat 方法。say扩展相关代码大家请看这篇文章。PHP7扩展开发之hello word 文中已经详细介绍了如何创建一个扩展和提供了源码下载。

  实现array_concat方法

  array_concat方法的PHP扩展源码:

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中的数组本质上就是一个哈希。

  对于哈希处理的方法主要集中在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如何在一个类中引入另外一个类】相关文章:

1.PHP中的类与对象入门知识

2.PHP use类文件中的命名空间问题

3.PHP排序算法类讲解

4.php调用父类方法

5.如何在HTML中嵌入PHP代码

6.php中抽象类与抽象方法的用法

7.PHP中如何定义类及其成员属性与操作

8.PHP经典常用特效类代码

9.如何在PHP中处理Protocol Buffers数据