php引入类的位置,php如何在一个类中引入另外一个类
有时候需要在一个类中调用另外一个类里面的方法,然后另外一个类又需要调用当前类的方法,怎么办呢?下面是具体的介绍。希望对大家有用,更多内容请关注应届毕业生网!
可以直接引入类对象的方式调用另外一个类的方法示例如下传值方式
class a {
function b$obj {
$obj->test;
}
}
class b {
function test {
echo 'test';
}
}
$a = new a;
$b->bnew 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
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_dumparray_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_FUNCTIONarray_concat
{
zval
*arr, *prefix, *entry, *prefix_entry, value;
zend_string
*string_key, *result;
zend_ulong
num_key;
if
zend_parse_parametersZEND_NUM_ARGS, "aa",
&arr, &prefix == FAILURE {
return;
}
array_init_sizereturn_value,
zend_hash_num_elementsZ_ARRVAL_Parr;
ZEND_HASH_FOREACH_KEY_VALZ_ARRVAL_Parr,
num_key, string_key, entry {
if
string_key && zend_hash_existsZ_ARRVAL_Pprefix, string_key {
prefix_entry
= zend_hash_findZ_ARRVAL_Pprefix, string_key;
if
Z_TYPE_Pentry == IS_STRING && prefix_entry != NULL && Z_TYPE_Pprefix_entry == IS_STRING {
result
= strpprintf0, "%s%s",
Z_STRVAL_Pprefix_entry, Z_STRVAL_Pentry;
ZVAL_STR&value,
result;
zend_hash_updateZ_ARRVAL_Preturn_value,
string_key, &value;
}
}
else if string_key == NULL && zend_hash_index_existsZ_ARRVAL_Pprefix, num_key{
prefix_entry
= zend_hash_index_findZ_ARRVAL_Pprefix, num_key;
if
Z_TYPE_Pentry == IS_STRING && prefix_entry != NULL && Z_TYPE_Pprefix_entry == IS_STRING {
result
= strpprintf0, "%s%s",
Z_STRVAL_Pprefix_entry, Z_STRVAL_Pentry;
ZVAL_STR&value,
result;
zend_hash_index_updateZ_ARRVAL_Preturn_value,
num_key, &value;
}
}
else if string_key {
zend_hash_updateZ_ARRVAL_Preturn_value,
string_key, entry;
zval_add_refentry;
}
else {
zend_hash_index_updateZ_ARRVAL_Preturn_value,
num_key, entry;
zval_add_refentry;
}
}ZEND_HASH_FOREACH_END;
}
代码说明
PHP中的数组本质上就是一个哈希。
对于哈希处理的方法主要集中在Zend/zend_hash.h中。
对于数组的操作方法主要集中在Zend/API.h。数组的方法其实就是对哈希处理方法的一层包装。
数组操作的方法主要是以add_assoc_ 和 add_index_开头的一些列方法。
下面是代码中涉及的一些方法。
zend_hash_num_elements获取数组的元素个数。
array_init_sizereturn_value, zend_hash_num_elementsZ_ARRVAL_Parr; 初始化一个数组。在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_refentry; 给数组的值,增加一次引用计数。zend_hash_update方法只自动给string_key自动增加了一次引用计数。数组return_value共用数组arr的值。因此,我们需要手动增加一次引用计数。
php引入类的位置,php如何在一个类中引入另外一个类相关推荐
- python 调用另一个py_跟我自学python 第9章 类(9.4.6 在一个模块中导入另一个模块)...
大家好今天学习9.4.6 在一个模块中导入另一个模块 .今天我们继续学习python.马上类就学完了. 喜欢python就关注冠山巡山使. 我将跟大家一块自学完python语言. 9.4.6 在一个模 ...
- java怎么调用另一个类的方法_在一个类中访问另一个类的方法
在一个类中访问另一个类的方法 由于Java应用程序是由若干个类构成的,因此经常需要在一个类中访问另一个类中的成员和方法,请问应该如何在一个类中访问另一个类的方法?下面是由百分网小编为大家整理的在一个类 ...
- android addview指定位置,Android开发中,请问当在一个视图中addView另一个布局视图时为什么报错?...
Android开发中,我在一个视图中addView另一个布局视图(该视图通过inflate加载获得,其中root为null即没有附加parent视图),为什么还是会报错误: The specified ...
- IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类
IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类 查看当前类所有的父类 查看当前所有的子类 查看当前类所有的父类 1.找到当前类所在的位置,右键选择Diagrams,然后选择 ...
- ABP:是否应该在一个应用服务中调用另外一个应用服务?
问题描述 在改bug过程中,我发现我需要在创建用户的函数下调用另外一处application service下的函数. 相当于我想在一个应用服务中调用另外一个应用服务. 分析: 网上找到的回答: I ...
- python中在一个字符串中查找另一个字符串。实现一个字符串的find函数。
1.在一个字符串中查找另一个字符串 2.找到了返回第一次出现的位置 3.没找到返回-1 4.参数s1为源字符串,参数s2为要查找的字符串 def index_of_str(s1, s2):n1=len ...
- Spring 如何在一个事务中开启另一个事务?
Spring项目,需要在一个事务中开启另一个事务. 上面提到的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两个方法, ...
- 在一个数组中删除另一个数组存在的值
在一个数组中删除另一个数组存在的值 可以在购物车中删除多个商品的时候用此方法 在Vuex实现完整购物车中有涉及,详见 Vuex实现完整购物车 <script type="text/ja ...
- php声明一个类的关键字,php中怎么实例化一个类
php中怎么实例化一个类 发布时间:2021-03-05 10:15:50 来源:亿速云 阅读:87 作者:小新 这篇文章主要介绍php中怎么实例化一个类,文中介绍的非常详细,具有一定的参考价值,感兴 ...
最新文章
- RedHat6.5-Linux安装telnet服务
- form 提交多个对象及springMVC接收
- 科大星云诗社动态20210309
- DP_字串匹配(HDU_1501)
- echo回声不能用了_已懂得用电子分频器,为何不继续加个效果器让音响效果更好?...
- 绝对不可错过的图形学算法!迭代最近点算法——ICP算法
- 刚刚,华为发布全球首款 5G 基站核心芯片!
- tomcat配置报错解决方法 The jre_home environment variable is not defined correctly
- 类似与fiddler的抓包工具 burp suite free edition
- ear的英语怎么念_ear的三种发音各有哪些英文单词
- Word 前一页以表格结尾的空白页的删除
- P6070 『MdOI R1』Decrease
- 二级计算机考试什么最难,计算机二级考试难吗 考试内容是什么
- 计算机桌面图标任意排列,教你win7电脑桌面图标怎么随意摆放
- Dev cpp 手动开栈
- mysql实验总结_数据库实验的心得体会.docx
- 解决PS 内存不足,RAM不足问题,方案汇总
- EV2400配合bqStudio的使用及电量计相关
- MySQL 的安装
- pssh Oracle,Linux批量远程管理主机命令_pssh用法详解
热门文章
- mysql 临时索引_MySQL select in 语句未使用索引,产生磁盘临时表,导致 crash
- python hmac_Python实现的HMacMD5加密算法示例
- 增量架构方法与系统构建
- nginx假死导致的问题回顾
- Where Should an Architect Begin?--reference
- 深入了解ibatis源码----简单ibatis示例代码
- Python基础知识(第一天)
- JS和JQUERY的区别
- 2019区块链行业指南
- 文本深度表示模型Word2Vec 简介 Word2vec 是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想,可以通过训练,把对文本内容的处理简