当前位置: 首页 > news >正文

PHP变量

什么是变量

变量通俗的来说是一种容器。根据变量类型不同,容器的大小不一样,自然能存放的数据大小也不相同。在变量中存放的数据,我们称之为变量值。

PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。在PHP中变量的命名规则通常是以字母或下划线开头,由字母、数字、下划线组成。变量名通常由声明变量所代表意义的英文单词组成。单词与单词之间通过_分隔,或者第一个单词首字母小写,之后每个单词首字母大写。这种命名方式我们称之为驼峰命名法。良好的命名规范有助于提高我们代码的可读性。

<?php
    $name = '屋脊猫';
    $_age = 1;
    $sex = '男';        
    echo "姓名:{$name},年龄:{$_age}, 性别:{$sex}";

    $1sex = '男';  // 错误,不能以数字开头
?>

变量的初始化

变量的初始化是给变量设置一个默认值(或者是需要的值),初始化的过程中PHP会给变量分配存储空间以及将变量值所在存储空间地址保存在变量中。



<?php
    $a = 1; // 初始化一个整形变量
?>

虽然在PHP中不需要初始化变量,但对变量进行初始化是个好习惯。未初始化的变量具有其类型的默认值

  • 布尔类型的变量默认值是 FALSE
  • 整形和浮点型变量默认值是零
  • 字符串型变量(例如用于 echo 中)默认值是空字符串
  • 数组变量的默认值是空数组

使用未初始化的变量会发出 E_NOTICE错误,但是在向一个未初始化的数组附加单元时不会。

依赖未初始化的变量的默认值在某些情况下会有问题,比如在之后的编码中我们需要经常的将一个文件通过include包含到当前文件,如果两个文件中有相同的变量名,此时的变量值则不是我们需要的默认值了。另外在PHP 5.4.0之前的版本中把 register_globals打开是一个主要的安全隐患。在PHP 5.4.0之后该配置已被移除。

变量的赋值方式

在PHP中有两种传值方式,分别为传值赋值和引用赋值。

1.传值赋值

传值赋值是PHP中默认的传值方式。那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。如:

<?php
    $var1 = 1;
    $var2 = $var1;
    $var1 = 3;
    echo $var1;     // 3
    echo $var2;     // 1
?>

2.引用赋值

引用赋值意味着新的变量简单的引用了原始的变量,改变了新的变量的值将影响到原始的变量的值,反之亦然。使用引用赋值,只需简单地将一个 & 符号加到将要赋值的变量前(源变量)如:

<?php
    $oldVar = 1;
    $newVar = &$oldVar;
    $newVar = 2;
    echo $oldVar;   // 2
    echo $newVar;   // 2
?>

&符在C语言中称之为取地址符,变量保存了变量值在内存中的存储地址,通过取地址符可以将一个变量保存的变量值的地址赋值给另一个变量。两个变量的值指向了同一个内存地址,所以当我们修改其中一个变量的值时,另一个变量的值自然而然的随之被改变。

有一点重要事项必须指出,那就是只有有名字的变量才可以引用赋值。

<?php
    $foo = 25;
    $bar = &$foo;      // 合法的赋值
    $bar = &(24 * 7);  // 非法; 引用没有名字的表达式
?>

(24*7)这个表达式中因为没有保存在变量中,所以没有明确的内存地址,通过取地址符去获取在内存中存储的地址是不可取的。

相关文章:

  • Jenkins进阶系列之——04Publish Over FTP Plugin插件
  • HashMap的长度为什么要是2的n次方
  • mysql主从复制配置过程及演示
  • [坑]解决Spring利用注解@Value获取properties属性为null或@Autowired 注解为null
  • 如何让git小乌龟工具TortoiseGit记住你的账号密码
  • POJ3013 Big Christmas Tree
  • 飘逸的python - 实现一个极简的优先队列
  • Linux常用查找命令
  • 留存- angularjs 弹出框 $modal
  • 矩阵相乘,向量相乘,矩阵向量相乘
  • Spring中基于Java的配置@Configuration和@Bean用法
  • 阿里技术面试题全面覆盖?不服,你来补充
  • Atitit mysql 存储过程捕获所有异常,以及日志记录异常信息
  • Android新手引导View
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • 【Amaple教程】5. 插件
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 30天自制操作系统-2
  • AWS实战 - 利用IAM对S3做访问控制
  • CentOS从零开始部署Nodejs项目
  • docker python 配置
  • es6要点
  • Flannel解读
  • gcc介绍及安装
  • JS笔记四:作用域、变量(函数)提升
  • orm2 中文文档 3.1 模型属性
  • React16时代,该用什么姿势写 React ?
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 机器学习中为什么要做归一化normalization
  • 聚类分析——Kmeans
  • 目录与文件属性:编写ls
  • 前端面试题总结
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ###项目技术发展史
  • #14vue3生成表单并跳转到外部地址的方式
  • #define,static,const,三种常量的区别
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (分布式缓存)Redis持久化
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (算法)Game
  • (转)Android学习笔记 --- android任务栈和启动模式
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net Web窗口页属性
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET框架
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • []FET-430SIM508 研究日志 11.3.31