热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP点运算符(.)与数据类型转换的深入探讨

如果估计没错,在PHP语言中,使用最多的运算符号当数点运算符号“.”,使用最多的语句当数“echo”。
如果估计没错,在 PHP 语言中,使用最多的运算符号当数点运算符号“.”,使用最多的语句当数“echo”。不难理解,PHP 的目标就是生成超文本脚本,而超文本脚本就是由字符串组成的,所以 PHP 处理最多的数据当是字符串,因此连接字符串的点运算符和输出字符串的语句“echo”就被经常用到。
    最常用的不一定是最熟悉的。当我们敲击 echo “....“; 语句输出运算结果的时候,有谁敢说自己已经对字符串、点符号了如指掌、运用自如了呢?
    比如,语句 echo ’100’; 和 echo 100; 输出的 html 代码结果都是 100,他们有什么不同?
    再比如,语句 echo 100.200; 和 echo 100[空格].[空格]200; 输出结果一样吗?为什么?
    ……
    1,了解 PHP 是一门“弱类型”的语言
    每门计算机语言(我知道的将近20门语言中),都是有数据类型的,PHP 概莫能外。“弱类型”的语言不是说该语言没有数据类型,而是说它弱化或不强调数据类型,具体的说,就是变量在使用前不必声明数据类型,类型根据所赋值的类型来决定,同时也定义了变量本身。但 PHP 的函数和各种操作符(运算符)又是有变量和操作数类型要求的。所以,不可避免的,存在一个数据类型的自动转换问题。强类型的语言,比如 C、C++、Java、C#,不同类型的数据是不允许参与混合运算的,如果需要,必需通过一些方法(比如函数、类的方法)进行类型转换。但 PHP 是允许不同类型的数据进行混合运算的(类似 Vbscript),PHP 解释引擎自动做了类型转换的工作。
    2,了解 echo 的操作数
    echo 实际上不是一个函数,而是一个语言结构,所以它可以用成 echo(’...’),也可以用成 echo ’...’。echo 的操作数类型应该是字符串型的。
    参考 PHP 手册对 echo 的说明:
    语法:echo(strings);
    参数 strings 必需。
    描述:一个或多个要发送到输出的字符串。
    小知识1:注意 echo 和 print 函数的区别,比如:
    echo “123“ . print(“abc“);  //语法正确,但输出不是123abc,而是 abc1231
                                //原因是首先执行 print()函数输出 abc,再连接“123“和函数的返回值1
    print “abc“ . echo(’ooo’);  //echo(’ooo’)会导致 Parse error: syntax error
    小知识2:echo 的简化语法 〈?= ’...’ ?〉
    小知识3:echo() 比 print() 函数快一点点。
    3,了解点运算符的操作数
    点运算符的操作数是字符串 strings。
    语法:strings . strings
    4,点运算符(.)的深入了解
    了解了前边的1、2、3,是不是就完全能正确应用字符串、echo、点运算符了呢?不尽然。熟悉语法和实际应用往往还是有距离的。再加上自动数据类型转换,导致了一定的复杂性。
    示例1:
    最一般的情况,输出字符串,比如 echo ’abc’ . “123“,结果是 abc123,没什么好解释的。
    示例2:
    echo true;
    输出结果是 1。true 是 PHP 内置布尔常量,输出前被转换为字符串“1“。
    echo false;
    输出结果是空。false 也是 PHP 内置布尔常量,输出前被转换为空字符串。
    示例3:
    echo 0==“ABC“;
    输出结果是 1。0==“ABC“ 中,字符串“ABC“首先被转换为数值型(字符串转换为数值,还有一个规则,有机会再讲),为0,再和 0 比较,结果为 true,再执行 echo true,为 1。默默地进行了 2 次类型转换。
    再注意,echo ’ABC’==0; 结果还是 1。注意不是把 0 转换为字符串 “0“ 再和字符串 ’ABC’ 比较从而得到 false。呵呵,很诡异吗?
    类似地有另一个题目:
    if(’ABC’==0)
      echo ’yes’;
    else
      echo ’no’;
    知道到底输出 yes 还是 no 了吗?
    示例4:再来个更诡异的。
    echo 100 . “ABC“; // 注意!点符号两边都有空格
    这句输出 100ABC,因为 100 被转化为“100“了。
    echo 100.“ABC“; // 注意!点符号两边没有空格,是连写
    但这句报告语法错误!为什么呀?因为 PHP 在这里把点符号当小数点对待了,“100.“ABC“” 当然不是个正确的数字了。
    echo 100. “ABC“;
    只有点符号右边有空格,语法错误。原因如上。
    echo 100 .“ABC“;
    只有点符号左边有空格,语法正确,输出 100ABC。
    类似的:
    $a = 100;
    echo $a . 200; //点符号两边有空格
    输出 100200。
    $a = 100;
    echo $a.200; //点符号两边没有空格
    语法错误。“$a.200”也不是一个合格的变量吧。
    示例5:
    echo 100 + “ABC“;
    输出结果是 100。注意不要认为这会产生语法错误,因为这里的“+”号是算数运算符,不是连接运算符的误写。“ABC“被转换为数字 0 了,加 100 后等于100,再转换为字符串“100“输出来。进行了2次类型转换。
    echo 100 + “20“ . 30; //点符号两边有空格
    结果输出 12030。
    echo 100 + “20“ .30; //点符号左边有空格,右边无空格
    语法错误。.30 被当作 double 类型的 0.30 了。与 100 + “20“ 的结果“120“直接摆在一起,PHP 分辨不清,报错了。
    还可以举出一些例子来。仔细体会,还是能找出类型转换规律的,PHP 其实并不诡异。
    即使 PHP 的老鸟,以上的情况也未必能了如指掌,见过很多 PHPer,自认为路子很野,编程“立等可取”,其实仔细较真起来,知识结构就像一张蜘蛛网,网眼大得能穿过一头鲸鱼,根本谈不上自称体系。所以,还是需要虚心、静心,沉下来学点基础知识。AD:若愿意,来我的西安 PHP 教育培训中心一起学习、探讨。

推荐阅读
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文是关于C#类型系统、值类型和引用类型的概念性笔记。介绍了C#1系统类型的三个特性,静态类型的含义,显式类型和隐式类型的区别。还讨论了类、结构、数组类型、枚举、委托类型和接口类型属于哪一种类型。同时纠正了关于结构、引用类型和对象传递的错误表述。最后提到了C#4中使用动态类型的关键字。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • 在C#/ .NET中,处理基督面前的日期没有内置支持,需要编写自己的代码。本文介绍了在处理此类日期时的最佳方法,并提供了一个示例链接,可以参考编码的解决方案。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
author-avatar
嗒嗒姗_215
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有