PHP的可变变量与可变函数
什么叫可变。在程序世界中,可变的当然是变量。常量在定义之后都是不可变的,在程序执行过程中,这个常量都是不能修改的。但是变量却不同,它们可以修改。那么可变变量和可变函数又是什么意思呢?很明显,就是用另一个变量来定义他们,这个变量是可变的呀!
可变变量
$a = 'hello';
$$a = 'world';
echo $a, ' ', $hello;
咦,我们没有定义\$hello这个变量呀。嗯,从表面上看我们确实没有定义这个变量,但请注意这个$$符号。$符号的意思就是定义变量,当我们在一个$符号后面跟上一个已经定义的变量名,那么这个变量的内容就成为了新的变量名。也就是说,$a的内容hello成为了一个新的变量名叫$hello,然后给它赋值为world。是不是感觉不太好理解,也不便于我们查看代码,这个问题我们最后再说。
当然,以下的用法要注意:
$a = 1;
$$a = 2;
echo $1; // Parse error: syntax error, unexpected '1'
echo ${1}; // ok
$a = ['b', 'c', 'd'];
$$a = 'f';
echo $b, $c, $d;
- 数字类型不是合法的变量名,不能作为可变变量被定义
- 但是利用{},是可以输出的,{}会获取{}内部的值并作为一个变量来解析,这里的{1}我们利用可变变量赋值成为了一个变量,直接输出是非常的,但放在{1}中就成为了一个可解析的变量名,我们可以简单的理解为{1}转换成了$'1',成为了一个正式的变量名
- 数组当然是不行啦
- 它们这样写都是不会报错的
使用对象就不行了,直接就会报错了,对象是不能进行可变变量的操作的。
class A {}
class B extends A {}
$a = new A();
$$a = new B(); // Catchable fatal error: Object of class A could not be converted to string
可变函数
可变函数其实也大同小异,当我们在一个变量的后面加上()时,PHP就会尝试将这个变量当做函数来解析。
function testA()
{
echo "testA";
}
$a = 'testA';
$a(); // testA
可变变量是将一个字符串转换成了一个变量名,而可变函数则是将一个字符串当做函数名来调用。比如类中的方法,我们可以这样来调用:
class C
{
public function testA()
{
echo "C:testA";
}
public function testB()
{
echo "C:testB";
}
public function testC()
{
echo "C:testC";
}
}
$funcs = ['testA', 'testB', 'testC'];
$c = new C();
foreach ($funcs as $func) {
$c->$func();
}
可变函数的这种特性和另外两个系统函数的关系非常紧密,它们是:call_user_func()和call_user_func_array(),Laravel中服务容器的核心实现就是使用了call_user_func_array()来实现依赖注入与控制反转的,这个等我们将来学习到的时候再说。
总结
看似很美好很灵活的可变变量与可变函数在我们实际的开发中却很少使用。究其原因当然是可读性不好,代码不仅是写给机器的,也是写给人看的,团队中人员的水平不齐的话过多的使用这两种特性会产生非常多的混乱情况。但是,很多框架代码中会使用这些特性,所以,这也是我们向更高层次迈进所必须要掌握的东西。不管怎么样,学就是了,能在业务场合中使用可变变量或者函数大大节约代码量写出精致易读的代码更能彰显我们的技术实力。
参考链接:
https://www.php.net/manual/zh/language.variables.variable.php
https://www.php.net/manual/zh/functions.variable-functions.php
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532
PHP的可变变量与可变函数的更多相关文章
- php学习笔记5--php中的可变变量,可变函数及匿名函数
可变变量指的是:将一个变量的值再次当做一个变量名从而得到另外一个变量的值.如:$name = 'dqrcsc';$myname = 'name'; //$myname的值碰巧是另一个变量的变量名ech ...
- php中的可变变量、可变函数、匿名函数
1.可变变量 简而言之:获取一个普通变量的值作为这个可变变量的变量名. 如: $a = "hello"; $$a = " world"; /* $a 的值为&q ...
- PHP中可变变量到底有什么用?
转自:http://blog.csdn.net/engine_1124/article/details/8660291 什么是可变变量? PHP提供了一种其他类型的变量——可变变量.可变变量允许我们动 ...
- python引用在函数传参时的体现以及可变与不可变对象的对比
今天偶然看到 vamei 老师的博客 http://www.cnblogs.com/vamei/archive/2012/07/10/2582795.html 讲的是python动态类型以及引用的事儿 ...
- OC可变參数的函数实现va_start、va_end、va_list的使用
一.简单介绍 我们常常在编程的时候看见类似这种代码,如图1.1 图1.1 或者是这种可变參数,如图1.2 图1.2 二.基本知识介绍 在学习怎样写这样的格式的函数前,先简介几个经常使用的宏: 下面摘自 ...
- C语言利用va_list、va_start、va_end、va_arg宏定义可变參数的函数
在定义可变參数的函数之前,先来理解一下函数參数的传递原理: 1.函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈. 2.參数的内存存放格式:參数的内存地址存放在内存的堆栈段中, ...
- PHP 注释 数据类型 变量的定义/输出 类型的获取/转换 可变变量
注释方法: 1,单行注释: // 2, 多行注释: /* */ 二,数据类型 1,integer(整数型):在三十二位操作系统中它的有效范围是:-2147483648~+2147 ...
- python变量进阶(可变不可变,局部变量和全局变量)
变量进阶(理解) 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引 ...
- PHP的可变变量名
有时候可变的变量名会给编程带来很大的方便.也就是说变量名可以被动态的命名和使用.通常变量通过下面这样的语句来命名 : 1 2 3 <!--?php $a = 'hello'; ?--> 可 ...
随机推荐
- JavaWeb项目实战-油画商城
整个项目都已经上传到github-mmgallery上,供有需要的读者使用,主要文件来自于csdn,区别是csdn中的项目数据存储在MySQL中,本项目数据存储在Xml文件中.课件和学习视频课程来自M ...
- vim编辑文件时[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
出现这个问题是因为你上次编辑的时候在没有保存的情况下退出了(如:电脑关机等)也有可能是有其他人在和你同时进行编辑行为(不同会话中).这是因为在用vim编辑的时候,vim会在打开文件目录下 ...
- Linux搭建SQL server服务器
我们知道在Linux下安装服务有很多方式,最为简单的也就是yum安装,但是很多服务通过yum是无法安装的,如果想使用yum安装,需要指定yum安装仓库,我们今天需要安装MSQL Server,所以需要 ...
- Ratel:一直站在Android逆向巅峰的平头哥
本文来源:带动行业内卷,渣总义不容辞 字越少事儿越大,请关注github(可以点击阅读原文): https://github.com/virjarRatel 平头哥(ratel)是一个Android逆 ...
- 分布式文件系统FastDFS搭建实操
转载---------佳先森--- 一.什么是文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节 ...
- jquery validate 验证插件 解决多个相同的Name 只验证第一个的方案
方案一:如果 项目里不是只是个别页面 有多个name 验证, 那么利用 prototype 来写,把这段代码加在你所要使用多个name的页面 的js初始化里 即可 if ($.validator) ...
- Web安全-CDN相关技术
CDN介绍 CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发. ...
- python入门(需要C++基础)
title: python语法入门 author: Sun-Wind date: August 25, 2021 python语法入门 博主最近参加一项比赛,因为需要用到python,所以在这里记录自 ...
- spring-data-redis 连接泄漏,我 TM 人傻了
本系列是 我TM人傻了 系列第四期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...
- 五分钟搞定Docker安装ElasticSearch
前言 项目准备上ElasticSearch,为了后期开发不卡壳只能笨鸟先飞,在整个安装过程中遇到以下三个问题. Docker安装非常慢 ElasticSearch-Head连接出现跨域 Elastic ...