>  기사  >  백엔드 개발  >  PHP7 언어 기본에 대한 자세한 설명

PHP7 언어 기본에 대한 자세한 설명

coldplay.xixi
coldplay.xixi앞으로
2021-03-24 10:33:452676검색

PHP7 언어 기본에 대한 자세한 설명

기사 디렉토리

  • PHP 태그
  • PHP 지시문 구분 기호
  • PHP 댓글
  • 상수
  • PHP 변수
  • 데이터 유형
    • 정수
    • 부동 소수점 유형
    • NaN
    • 문자열 유형
      • 문자열의 문자 액세스 및 수정
    • 배열 유형
      • 배열 요소에 대한 액세스
      • 배열 요소 값 수정 및 생성
    • 객체 유형
      • 객체 초기화
    • 리소스 리소스 유형
      • 리소스 해제
    • NULL 유형
    • 콜백/콜러블 유형
    • 데이터 유형 간 상호 변환
      • 부울로 변환
      • Con 정수로 변환
      • 부동 소수점으로 변환
      • 문자열로 변환
      • 배열로 변환
      • 객체로 변환
      • 리소스로 변환
      • NULL로 변환
  • 스칼라 유형 선언
  • 연산자
    • Arith 메틱 연산자
    • 할당 연산자
    • 비트 연산자
    • 비교 연산자
    • 증가/감소 연산자
    • 논리 연산자
    • 문자열 연산자
    • 오류 제어 연산자
    • 실행 연산자
    • 배열 연산자
    • 유형 연산자
    • 삼항 연산자
    • 연산자 우선 순위
  • 표현

추천(무료): PHP7

PH P 마크

PHP 서버는 PHP 시작 태그와 끝 태그, 즉 <?php < 사이의 부분을 찾습니다. /code> 및 <code>?>, 작업 시작 및 종료 태그 다른 부분은 PHP 파서에서 무시됩니다. <?php ?>之间的部分,而任务起始和结束标记之外的部分会被php解析器忽略。
PHP也允许使用短标记?>,但已经不推荐使用了。如果要使用短标记需要在php.ini中将短标记配置选项short_open_tag的值设置为true,或者在编译php时使用配置选项--enable-short-tags

自 PHP 5.4 起,短格式的 echo 标记 = 总会被识别并且合法,而不管 short_open_tag 的设置是什么。

PHP还支持<script language="php"></script>这样的开始和结束标记,并且这种标记不需要任何配置就可以使用,效果与<?php ?>相同。

PHP还可以使用ASP风格标记,需要在php.ini中打开asp_tags选项,但由于移植性等原因不推荐使用此种标记。

如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。

【示例】

<?phpecho  "Hello World";// ... more codeecho "Last statement";// 脚本至此结束,不使用结束标记

在 PHP 5.2 和之前的版本中,解释器不允许一个文件的全部内容就是一个开始标记 <?php 。自 PHP 5.3 起则允许此种文件,但要开始标记后有一个或更多白空格符。

PHP指令分隔符

php代码以;作为语句结束指令。在一个PHP代码段中的最后一行可以不用分号结束。如果前面还有新行,则代码段的结束标记包含了行结束。
【以下都是合法的php语句】

    <?php     	echo "This is a test";
    ?>
    
    <?php  echo "This is a test" ?>
    
    <?php  echo &#39;We omitted the last closing tag&#39;;

文件末尾的 PHP 代码段结束标记可以不要,有些情况下当使用 include 或者 require 时省略掉会更好些,这样不期望的空白符就不会出现在文件末尾,之后仍然可以输出响应标头。在使用输出缓冲时也很便利,就不会看到由包含文件生成的不期望的空白符。

PHP注释

PHP支持C、C++和Unix Shell风格(Perl风格)的注释。
单行注释//仅仅注释到行末或者当前的PHP代码块。
多行注释/* */,以/*开始,直到碰到第一个*/ PHP에서는 ?>라는 짧은 태그의 사용도 허용하지만 더 이상 사용을 권장하지 않습니다. 짧은 태그를 사용하려면 php.ini에서 짧은 태그 구성 옵션 short_open_tag의 값을 true로 설정하거나 --enable-short-tags 구성 옵션을 사용해야 합니다. PHP 코드를 컴파일할 때>.

PHP 5.4부터 짧은 형식의 echo 태그 =는 short_open_tag 설정에 관계없이 항상 인식되고 유효합니다.

PHP는 <script></script>와 같은 열기 및 닫기 태그도 지원하며 이러한 태그는 별도의 구성 없이 사용할 수 있습니다. <?php ?>와 동일합니다.

PHP는 ASP 스타일 태그 를 사용할 수도 있습니다. php.ini에서 asp_tags 옵션을 활성화해야 하지만 이는 권장되지 않습니다. 이식성 및 기타 이유.

    파일 내용이 순수 PHP 코드인 경우 파일 끝에 있는 PHP 닫는 태그를 제거하는 것이 가장 좋습니다. 이는 PHP가 실수로 닫는 태그 뒤에 공백이나 줄 바꿈을 추가하는 것을 방지합니다. 이로 인해 PHP는 스크립트에서 공백을 출력할 의도가 없을 때 이러한 공백을 출력하기 시작합니다.

[예]
define("常量名", 常量值);
PHP 5.2 및 이전 버전에서는 인터프리터가 파일의 전체 내용을 시작 태그


PHP 명령 구분 기호
  1. php 코드는 ;로 끝납니다. PHP 코드 조각의 마지막 줄은 세미콜론으로 끝날 필요가 없습니다. 그 앞에 새 줄이 있으면 줄의 끝이 코드 조각의 닫는 태그에 포함됩니다.
  2. [다음은 합법적인 PHP 문입니다]
<?php define("WELCOME", "欢迎来到PHP的世界");			// 定义常量WELCOME
	echo WELCOME;									// 输出常量值?>

파일 끝에 있는 PHP 코드 세그먼트 종료 태그는 어떤 경우에는 include 또는 require를 사용할 때 생략하는 것이 더 낫습니다. 공백 문자는 파일 끝에 나타나지 않으며 그 후에도 응답 헤더가 계속 출력될 수 있습니다. 출력 버퍼링을 사용할 때도 편리하므로 포함 파일에서 생성된 원치 않는 공백 문자가 표시되지 않습니다.

PHP 주석🎜🎜PHP는 C, C++ 및 Unix Shell 스타일(Perl 스타일) 주석을 지원합니다. 🎜 한 줄 주석 //은 줄 끝이나 현재 PHP 코드 블록에만 주석을 달 수 있습니다. 🎜 여러 줄 주석 /* *//*로 시작하고 첫 번째 */가 나타나면 끝납니다. 여러 줄 주석은 중첩될 수 없습니다. 여러 줄 주석. 🎜🎜🎜상수🎜🎜🎜PHP에서 상수는 한번 선언되면 변경할 수 없는 값입니다. 🎜🎜🎜상수 선언 및 사용🎜 PHP는 정의() 명령을 통해 상수를 선언합니다. 형식은 다음과 같습니다. 🎜🎜
    <?php     echo "使用传值方式赋值:<br/>";			// 输出 使用传值方式赋值:
    $a = "变量的名字为a";
    $b = $a;								// 将变量$a的值赋给$b,两个变量指向不同内存空间
    echo "变量a的值为".$a."<br>";			// 输出变量a的值
    echo "变量b的值为".$b."<br>";			// 输出变量b的值
    $a = "修改变量a的值";					// 改变变量a的值,变量b的值不受影响
    echo "变量a的值为".$a."<br>";			// 输出变量a的值
    echo "变量b的值为".$b."<p>";			// 输出变量b的值
    
    echo "使用引用方式赋值:<br>";			// 输出 使用引用方式赋值:
    $a = "引用赋值测试";
    $b = &$a;								// 将变量$a的引用赋给$b,两个变量指向同一块内存
    echo "变量a的值为".$a."<br>";			// 输出变量a的值
    echo "变量b的值为".$b."<br>";			// 输出变量b的值
    $a = "修改变量a的值";
    /*
    改变变量a的内存空间中存储的内容,变量b也指向该空间,b的值也发生变化
    */
    echo "变量a的值为".$a."<br>";			// 输出变量a的值
    echo "变量b的值为".$b."</p><p>";			// 输出变量b的值
    ?></p>
🎜상수 이름은 문자열이며 일반적으로 PHP 코딩 표준에 따라 대문자 영어로 표시됩니다. 다음과 같이: CLASS_NAME, MYAGE 외. 🎜 상수 값은 다양한 PHP 데이터 유형일 수 있으며 배열, 객체 또는 문자와 숫자일 수 있습니다. 🎜 [예시]🎜
	    <?php     $value0 = "guest";		// 定义变量$value0并赋值
	    $$value0 = "customer";	// 再次给变量赋值
	    echo $guest."<br />";	// 输出变量
	    $guest = "ib-top.com";		// 定义变量$guest并赋值
	    echo $guest."\t".$$value0."<br>";
	    
	    $value1 = "ib-top.cn";		// 定义变量$value1
	    $value2 = &$value1;			// 引用变量并传递变量
	    echo $value1."\t".$value2."<br>";	//输出变量
	    $value2 = "冰蓝工作室";
	    echo $value1."\t".$value2;
	    ?>
🎜🎜내장 상수🎜🎜🎜PHP의 내장 상수는 시스템 구축 초기에 PHP가 정의한 일부 값을 의미합니다. PHP에는 사전 정의된 시스템 내장 상수가 많이 있으며 이러한 출력은 언제든지 호출할 수 있습니다. 🎜🎜자주 사용되는 내장 상수🎜🎜
  • _FILE_:这个默认常量是文件的完整路径和文件名。若引用文件(include或require),则在引用文件内的该常量为引用文件名,而不是引用它的文件名。
  • _LINE_:这个默认常量是PHP程序行数。若引用文件(include或require)则在引用文件内的该常量为引用文件的行,而不是引用它的文件行。
  • PHP_VERSION:这个内置常量是PHP程序的版本。
  • PHP_OS:这个内置常量是指执行PHP解析器的操作系统名称。
  • TRUE:代表真值true
  • FALSE:代表假值false
  • E_ERROR:这个常量指到最近的错误处。
  • E_WARNING:这个常量指导最近的警告处。
  • E_PARSE:这个常量指到解析语法有潜在问题处。
  • E_NOTICE:这个常量为发生不寻常但不一定是错误处。
  • _DIR_:这个常量为文件所在的目录。该常量在PHP 5.3.0版本中新增。
  • _FUNCTION_:这个常量为函数的名称。从PHP5开始,此常量返回该函数被定义时的名字,区分大小写。
  • _CLASS_:这常量为类的名称。从PHP5开始,此常量返回该类被定义时的名字,区分大小写。

PHP变量

变量像一个贴有名字标签的空盒子。不同的变量类型对应不同种类的数据,就像不同种类的东西要放入不同种类的盒子。

  1. PHP中的变量声明
    PHP中的变量一般以$作为前缀,然后以字母a~z的大小写或者“_”下划线开头。这是变量的一般表示。
    PHP中不需要显式地声明变量,但是定义变量前进行声明并带有注释,是一个好程序员应该养成的习惯。
    PHP的赋值有两种:

    • 传值赋值:使用“=”直接将赋值表达式的值赋给另一个变量。
    • 引用赋值:将赋值表达式内存空间的引用赋给另一个变量。需要在“=”左后的变量前面加上一个“&”符号。
      【示例】
        <?php     echo "使用传值方式赋值:<br/>";			// 输出 使用传值方式赋值:
        $a = "变量的名字为a";
        $b = $a;								// 将变量$a的值赋给$b,两个变量指向不同内存空间
        echo "变量a的值为".$a."<br>";			// 输出变量a的值
        echo "变量b的值为".$b."<br>";			// 输出变量b的值
        $a = "修改变量a的值";					// 改变变量a的值,变量b的值不受影响
        echo "变量a的值为".$a."<br>";			// 输出变量a的值
        echo "变量b的值为".$b."<p>";			// 输出变量b的值
        
        echo "使用引用方式赋值:<br>";			// 输出 使用引用方式赋值:
        $a = "引用赋值测试";
        $b = &$a;								// 将变量$a的引用赋给$b,两个变量指向同一块内存
        echo "变量a的值为".$a."<br>";			// 输出变量a的值
        echo "变量b的值为".$b."<br>";			// 输出变量b的值
        $a = "修改变量a的值";
        /*
        改变变量a的内存空间中存储的内容,变量b也指向该空间,b的值也发生变化
        */
        echo "变量a的值为".$a."<br>";			// 输出变量a的值
        echo "变量b的值为".$b."</p><p>";			// 输出变量b的值
        ?></p>

    运行结果:
    PHP7 언어 기본에 대한 자세한 설명

  2. 可变变量与变量引用
    首先来看一个例子:

	    <?php     $value0 = "guest";		// 定义变量$value0并赋值
	    $$value0 = "customer";	// 再次给变量赋值
	    echo $guest."<br />";	// 输出变量
	    $guest = "ib-top.com";		// 定义变量$guest并赋值
	    echo $guest."\t".$$value0."<br>";
	    
	    $value1 = "ib-top.cn";		// 定义变量$value1
	    $value2 = &$value1;			// 引用变量并传递变量
	    echo $value1."\t".$value2."<br>";	//输出变量
	    $value2 = "冰蓝工作室";
	    echo $value1."\t".$value2;
	    ?>
运行结果:

PHP7 언어 기본에 대한 자세한 설명

【代码分析】
首先,$value0被赋值guest。因此,$value0相当于guest,于是$$value0相当于$guest。所以当$$value0被复制为customer时,打印$guest就得到customer。当$guest被赋值为ib-top.com时,打印$$value0得到的就是ib-top.com,这就是可变变量。
其次在代码的第二部分里,$value1被赋值ib-top.cn,然后通过“&”引用变量$value1并赋值给$value2.实际上就是将变量$value1添加了一个别名$value2.由于$value2是别名,因此和$value1指向同一个变量。因此当$value2被赋值“冰蓝工作室”后,$value1$value2都得到了新值。
可变变量其实是允许改变一个变量的变量名,允许使用一个变量的值作为另一个变量的名。
变量引用相当于给变量添加了一个别名,使用“&”来引用变量。在计算机内部,两个变量名指向同一个变量。

  1. 变量作用域
    变量作用域(variable scope),是指特定变量在代码中可以被访问到的位置。在PHP中有6种基本的变量作用域法则:
    • 内置超全局变量(Built-in superglobal variables),在代码中的任意位置都可以访问到。

      • 超全局变量,sperglobal或autoglobal,这些超全局变量是由PHP预先定义好以方便使用的。
        • $GLOBALS:包含全局变量的数组。
        • $_GET:包含所有通过GET方法传递给代码的变量的数组。
        • $_POST:包含所有通过POST方法传递给代码的变量的数组。
        • $_FILES:包含文件上传变量的数组。
        • $_COOKIES:包含cookie变量的数组。
        • $_SERVER:包含服务器环境变量的数组。
        • $_ENV:包含环境变量的数组。
        • $_REQUEST:包含用户所有输入内容的数组(包括                                                                                            G                                                         E                                           T                                           、                                                    _GET、                                   GET_POST和$_COOKIE)。
        • $_SESSION:包含会话变量的数组。
    • 常量(constants),一旦声明,就是全局性的,可以在函数内外使用。
      可以用define()函数来定义常量,在PHP5.3.0后,可以使用const关键字在类定义之外定义常量。一个常量一旦被定义,就不能再改变或者取消定义。

    • 全局变量(global variables),在代码间声明,可在代码间访问,但是不能在函数内访问。
      【示例1】

    <?php $room = 20;				// 定义全局变量
	function showrooms() {
		echo $room;			// 函数内部访问全局变量
	}
	showrooms();			// 访问全局变量
	echo $room.&#39;间房间。&#39;;
	?>

运行结果:
PHP7 언어 기본에 대한 자세한 설명
出现上述结果,是因为函数无法访问外部全局变量,但是在代码间可以访问全局变量。
【示例2】

    <?php     $room = 20;				// 定义全局变量
    function showrooms() {
    	global $room;		// 函数内部调用全局变量
    	echo $room.&#39;间新房间。<br />';
    }
    showrooms();			// 访问全局变量
    echo $room.'间房间。';
    ?>

运行结果:
PHP7 언어 기본에 대한 자세한 설명
除了使用global在函数内部调用全局变量外,还可以通过“超全局变量”中的$GLOBALS数组进行访问。
【示例3】

    <?php     $room = 20;				// 定义全局变量
    function showrooms() {
    	$room = $GLOBALS[&#39;room&#39;]	// 通过$GLOBALS数组访问全局变量
    	echo $room.&#39;间新房间。<br />';
    }
    showrooms();			// 访问全局变量
    echo $room.'间房间。';
    ?>
* 在函数中声明为全局变量的变量就是同名的全局变量。
* 在函数中创建和声明为静态变量的变量在函数外是无法访问的,但这个静态变量的值可以保留。
* 在函数中创建和声明的局部变量在函数外是无法访问的,并且在本函数终止时失效。
* 静态变量

静态变量只是在函数内存在,在函数外无法访问。但是执行后,其值保留,也就是说这一次执行完毕后,静态变量的值保留,下一次再执行此函数,这个值还可以调用。
【示例】

    <?php     $person = 20;
    function showpeople(){
    	static $person = 5;
    	$person++;
    	echo &#39;再增加一位,将会有&#39;.$person.&#39;位static人员。<br />';
    }
    showpeople();
    echo $person.' 人员。<br>';
    showpeople();
    ?>

运行效果:
PHP7 언어 기본에 대한 자세한 설명

  1. 变量的销毁
    当用户创建一个变量时,相应地在内存中有一个空间专门用于存储该变量,该空间引用计数加i。当变量与该空间的联系被断开时,空间引用计数减1,直到引用计数为0,则成为垃圾。
    PHP有自动回收垃圾的机制,用户也可以手动销毁变量,通常使用unset()函数来实现。该函数的语法格式如下:
void unset (变量)

其中,变量类型为局部变量,则变量被销毁;如果变量类型为全局变量,则变量不会被销毁。
【示例】

<?php function xiaohui() {
	global $b;		// 函数内使用global关键字声明全局变量$b
	unset ($b);		// 使用unset()销毁不再使用的变量$b 
}
$b = &#39;冰蓝工作室&#39;;	// 函数外声明全局变量
xiaohui();			// 调用函数
echo $b;			// 查看全局变量是否发生变化
?>

运行效果:
PHP7 언어 기본에 대한 자세한 설명

数据类型

PHP支持9种原始数据类型。

  • 四种标量类型

    • boolean(布尔型)
    • integer(整型)
    • float(浮点型,也称作double)
    • string(字符串)
  • 三种复合类型:

    • array(数组)
    • object(对象)
    • callable(可调用)
  • 两种特殊类型:

    • resource(资源)
    • NULL(无类型)

如果想查看某个表达式的值和类型,用var_dump()函数。如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype()函数。要检验某个类型,不要用gettype(),而用is_type函数。

【示例】

<?php $a_bool = TRUE;			// 布尔值 boolean$a_str = "foo";			// 字符串 string$a_str2 = &#39;foo&#39;;		// 字符串 string$an_int = 12;			// 整型 integer$a_float = 3.14;		// 浮点型 floatecho gettype($a_bool);		// 输出: booleanecho gettype($a_str);		// 输出: stringecho gettype($a_str2);		// 输出: stringecho gettype($an_int);		// 输出: integerecho gettype($a_float);		// 输出: double// 如果是整型,就加上4if (is_int($an_int)) {
	$an_int += 4;}// 如果 $bool 是字符串,就打印出来// 未打印任何信息if (is_string($a_bool)) {
	echo "String: $a_bool";}?>

Boolean布尔类型

标量类型。表达了真值,可以为TRUE或FALSE。

  • 语法
    要指定一个布尔值,使用常量TRUE或FALSE。两个都不区分大小写。
    通常运算符所返回的boolean值结果会被传递给控制流程。
    当运算符,函数或控制结构需要一个boolean参数时,会将结果自动转换为一个boolean值,也可以显式的将一个值强制转换成boolean,用(bool)或者(boolean)来强制转换。
    自动转换规则:
  • 整型,为0时,布尔值为false,为非零时,布尔值为true。
  • 浮点型,为0.0时,布尔值为false,为非零时,布尔值为true。
  • 字符串型,为空字符串""或者零字符串“0”时,布尔值为false,包含除此以外的字符串时其布尔值为true。
  • 数组型,若不含任何元素,其布尔值为false,只要包含元素,其布尔值为true。
  • 对象型,资源型,布尔值永远为true。
  • NULL型,布尔值永远为false。

Integer整型

整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。
二进制表达的 integer 自 PHP 5.4.0 起可用。
要使用八进制表达,数字前必须加上 0(零)。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b。
integer 语法的结构形式是:
decimal: [1-9][0-9]*
    | 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal: 0[0-7]+
binary: 0b[01]+
integer: [±]?decimal
    | [±]?hexadecimal
    | [±]?octal
    | [±]?binary

整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9E18,除了 Windows 下 PHP 7 以前的版本,总是 32 位的。 PHP 不支持无符号的 integer。Integer 值的字长可以用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 来表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量 PHP_INT_MIN 表示。

PHP 7 以前的版本里,如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。PHP 7 以后,会产生 Parse Error。

如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。

PHP 中没有整除的运算符。1/2 产生出 float 0.5。值可以舍弃小数部分,强制转换为 integer,或者使用 round() 函数可以更好地进行四舍五入。

浮点型

浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:

<?php $a = 1.234;$b = 1.2e3;$c = 7E-10;?>

浮点数的字长和平台相关,尽管通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)。

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。

NaN

某些数学运算会产生一个由常量 NAN 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值(除了 TRUE)进行的松散或严格比较的结果都是 FALSE。
由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。

字符串型

一个字符串string就是由一系列的字符组成,其中每个字符等同于一个字节,PHP只支持256的字符集,因此不支持Unicode。

一个字符串最大可以达到2GB。

字符串型(string)的数据是表示在引号之间的。引号分为双引号("")和单引号(’’)。双引号几乎可以包含所有的字符,但是在其中的变量显示变量的值,而不是变量的变量名,而有些特殊字符加上""符号就可以了;单引号内的字符是直接表示出来的。

第三种表达字符串的方法是用heredoc语法结构:必须在该行的第一列,而且标识符的命名也要像其它标签一样遵守PHP命名规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。

要注意的是结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符。也就是说结束标识符不能缩进,分号的前后也不能有任何空白或制表符。更重要的是结束标识符的前面必须是个被本地操作系统认可的换行,而结束标识符(可能其后有个分号)之后也必须紧跟一个换行。
Heredoc结构不能用来初始化类的属性。自PHP 5.3起,此限制仅对heredoc包含变量时有效。

heredoc结构就像是没有使用双引号的双引号字符串,在heredoc结构中单引号不用转义,并且变量将被替换为变量值。
示例

<?php $str = <<<EODExample of string
spanning multiple lines
using heredoc syntax.EOD;/* 含有变量的更复杂示例 */class foo{
    var $foo;
    var $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }}$foo = new foo();$name = 'MyName';echo foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41EOT;?>

以上代码会输出:

My name is "MyName". I am printing some Foo. Now, I am printing some Bar2. This should print a capital 'A': A

也可以把Heredoc结构用在函数参数中来传递数据:

<?phpvar_dump (array(<<<EODfoobar!EOD));?>

以上代码会输出

array(1) { [0]=> string(7) "foobar!" }

在PHP5.3.0以后,也可以用Heredoc结构来初始化静态变量和类的属性和常量:

<?php // 静态变量function foo(){
	static $bar = <<<LABELNothing in here...LABEL;}// 类的常量、属性class foo{
	const BAR = <<<FOOBARConstant exampleFOOBAR;
	
	public $baz = <<<FOOBARProperty exampleFOOBAR;}?>

自PHP5.3.0起还可以在Heredoc结构中用双引号来声明标识符:

<?phpecho  <<<"FOOBAR"Hello world!FOOBAR;?>

第四种表示方式是Nowdoc结构,与Heredoc结构类似,使用标记 heredoc结构类似于双引号字符串,Nowdoc结构类似于单引号字符串,因此nowdoc中不进行解析操作。这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。
示例

<?php $str = <<<&#39;EOD&#39;Example of string
spanning multiple lines
using heredoc syntax.EOD;/* 含有变量的更复杂示例 */class foo{
    var $foo;
    var $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }}$foo = new foo();$name = 'MyName';echo foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41EOT;?>

以上代码会输出

My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': \x41

Nowdoc结构是在PHP5.3.0中加入的。

** 变量解析 **
当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。
共有两种语法规则:一种简单规则,一种复杂规则。简单的语法规则是最常用和最方便的,它可以用最少的代码在一个 string 中嵌入一个变量,一个 array 的值,或一个 object 的属性。

复杂规则语法的显著标记是用花括号包围的表达式。

简单语法
当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。
示例

<?php $juice = "apple";echo "He drank some $juice juice.".PHP_EOL;// Invalid. "s" is a valid character for a variable name, but the variable is $juice.echo "He drank some juice made of $juices.";?>

以上代码输出如下
PHP7 언어 기본에 대한 자세한 설명

同样,一个array索引或一个object属性也可以被解析。
示例

<?php $juices = array("apple", "orange", "koolaid1"=>"purple");echo "He drank some $juices[0] juice.".PHP_EOL;echo "He drank some $juices[1] juice.".PHP_EOL;echo "He drank some juice made of $juice[0]s.".PHP_EOL;  //Won't workecho "He drank some $juices[koolaid1] juice.".PHP_EOL;class people {
	public $john = "John Smith";
	public $jane = "Jame Smith";
	public $robert = "Robert Paulsen";
	
	public $smith = "Smith";}$people = new people();echo "$people->john drank some $juices[0] juice.".PHP_EOL;echo "$people->john then said hello to $people->jane.".PHP_EOL;echo "$people->john's wife greeted $people->robert.".PHP_EOL;echo "$people->robert greeted the two $people->simths."; //Won't work?>

以上代码输出如下
PHP7 언어 기본에 대한 자세한 설명

复杂(花括号)语法
复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。可以用 {$ 来表达 {$。
示例

<?php // 显示所有错误error_reporting(E_ALL);$great = &#39;fantastic&#39;;// 无效,输出:This is { fantastic}echo "This is { $great}";// 有效,输出:This is fantasticecho "This is {$great}";echo "This is ${great}";// 有效echo "This square is {$square->width} 00 centimeters broad.";// 有效,只有通过花括号语法才能正确解析带引号的键名echo "This works:{$arr['key']}";// 有效 echo "This works:{$arr[4][3]}";// 这是错误的表达式,因为就像$foo[bar]的格式在字符串以外也是错的一样。// 换句话说,只有在PHP能找到常量foo的前提下才会正常工作;这里会产生一个E_NOTICE(undefined constant)级别的错误。echo "This is wrong:{$arr[foo][3]}";// 有效,当在字符串中使用多重数组时,一定要用括号将它括起来echo "This works:{$arr['foo'][3]}";echo "This works too:{$obj->values[3]->name}";echo "This is the value of the var named $name: {${$name}}";echo "This is the value of the var named by the return value of getName():{${$getName()}}";echo "This is the value of the var named by the return value of \$object->getName():{${$object->getName()}}";// 无效,输出:This is the return value of getName():{getName()}echo "This is the return value of getName():{getName()}";

还可以在字符串中用这种语法通过变量来调用类的属性。
示例

<?phpclass  foo {
	var $bar = "I am bar.";}$foo = new foo();$bar = &#39;bar&#39;;$baz = array(&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;, &#39;quux&#39;);echo "{$foo->$bar}\n";echo "{$foo->{$baz[1]}}\n";?>

函数、方法、静态类变量和类常量只有在 PHP 5 以后才可在 {$} 中使用。然而,只有在该字符串被定义的命名空间中才可以将其值作为变量名来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。

<?php // 显示所有错误error_reporting(E_ALL);class beers {
	const softdrink = &#39;rootbeer&#39;;
	public static $ale = &#39;ipa&#39;;}$rootbeer = &#39;A & W&#39;;$ipa = &#39;Alexander Keith\&#39;s&#39;;//有效, 输出: I&#39;d like an A & Wecho "I&#39;d like an {${beers::softdrink}}\n";//也有效,输出:I&#39;d like an Alexander Kerith&#39;s
echo "I&#39;d like an {${beers::$ale}}\n";?>

存取和修改字符串中的字符

string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string 当成字符组成的 array。函数 substr() 和 substr_replace() 可用于操作多于一个字符的情况。

string也可以用花括号访问,比如                                 s                         t                         r                         42                         ,                         效                         果                         和                            str{42},效果和                 str42str[42]一样


用超出字符串长度的下标写入将会增加字符串长度并以空格填充。非整数类型下标会被转换为整数。非法下标类型将会产生一个E_NOTICE级别的错误。用负数下标写入字符串时会产生一个E_NOTICE级别的错误,用负数下标读取字符串时返回空字符串。写入时只用到了赋值字符串的第一个字符,用空字符串赋值则赋给的值是NULL字符。


PHP的字符串在内部是字节组成的数组,因此用花括号访问或修改字符串对多字节字符集很不安全。仅应对单字节编码例如ISO-8859-1的字符进行此类操作。

自 PHP 5.4 起字符串下标必须为整数或可转换为整数的字符串,否则会发出警告。之前类似 “foo” 的下标会无声地转换成 0。

用 [] 或 {} 访问任何其它类型(不包括数组或具有相应接口的对象实现)的变量只会无声地返回 NULL。 PHP 5.5 增加了直接在字符串原型中用 [] 或 {} 访问字符的支持。

数组型

数组(array)是PHP变量的集合,是按照“键”与“值”的对应关系组织数据的。数组的键值既可以是整数,也可以是字符串。数组不显式声明键值的默认情况下,数组元素的键值从零开始。
PHP中的数组实际上是一个有序映射。映射是一种把values关联到keys的类型。
可以使用list()函数或array()函数来创建数组,也可以直接进行赋值。
示例

<?php $arr = array		// 定义数组并赋值(0 => 15,2 => 1E+05,1 => "PHP数组语法",);for ($i = 0; $i ";}?>

以上代码中用"=>"为数组元素赋值,数组的下标只是存储的标识,没有任何意义,数组元素的排列以加入的先后顺序为准。

可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1, 2) 而不是 array(1, 2, )。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。

自 5.4 起可以使用短数组定义语法,用 [] 替代 array()。

示例

<?php $arr = array("foo" => "bar","bar" => "foo",);// 自PHP5.4起$arr = ["foo" => "bar","bar" => "foo",];?>

其中key 可以是 integer 或者 string。value 可以是任意类型。
关于key还有如下转换规则

  • 包含有合法整型值的字符串会被转换为整型。 例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
  • 数组和对象不能被用作键名。坚持这么做会导致警告:Illegal offset type。

如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

示例

<?php $arr = array(1 => "a","1" => "b",1.5 => "c",true => "d",);var_dump($arr);?>

以上代码会输出:

array(1) { [1]=> string(1) "d" }

因为以上代码中的所有键名都被强制转换为1,则每一个新单元都会覆盖前一个的值。

PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。

key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。

数组元素的访问

数组单元可以通过 array[key] 语法来访问。

方括号和花括号可以互换使用来访问数组单元(例如 $array[42] 和 $array{42} 在上例中效果相同)。

自 PHP 5.4 起可以用直接对函数或方法调用的结果进行数组解引用,在此之前只能通过一个临时变量。

自 PHP 5.5 起可以直接对一个数组原型进行数组解引用。

示例

<?phpfunction  getArray() {
	return array(1, 2, 3);}// PHP5.4$secondElement = getArray()[1]// PHP5.4之前$tmp = getArray();$secondElement = $tmp[1];// 或者list(, $secondElement) = getArray();?>

试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 NULL。

数组元素值的修改与新建

可以显式的指定数组的下标来修改一个已有数组。通过在方括号内指定键名来给数组赋值。也可以省略键名,在这种情况下给变量名加上一对空的方括号([])。

$arr[key] = value;
$arr[] = value;
// key可以是integer或string类型
// value可以是任意类型

以上代码中,如果$arr不存在,将会新建一个,这也是另一种新建数组的方法。但并不推荐这样做,因为如果$arr已经有值,则此值会保留而[]实际上代表着字符串访问运算符。

要修改某个值,通过其键名给该单元赋一个新值即可。要删除某键值对,对齐调用unset()函数。

Object对象型

对象(object)就是类的实例。当一个类被实例化以后,这个被生成的对象被传递给一个变量,这个变量就是对象型变量。对象型变量也属于资源型变量。

对象初始化

要创建一个新的对象object,使用new语句实例化一个类:

<?phpclass  foo {
	function do_foo() {
		echo "Doing foo.";
	}}$bar = new foo;$bar->do_foo();?>

以上代码中$bar的类型就是object类型。

Resource资源类型

资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。(get_resource_type())
资源类型是十分特殊的数据类型。它表示PHP的扩展资源,可以是一个打开的文件,也可以是一个数据库连接,甚至可以是其他的数据类型。

释放资源

引用计数系统是 Zend 引擎的一部分,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。

持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。

NULL类型

NULL类型是仅拥有NULL这个值的类型,表示一个变量没有值。这个类型用来标记一个变量为空。一个空字符串与NULL是不同的。在数据库存储时会把空字符串和NULL区分处理。NULL型在布尔判断时永远为false。很多情况下,在声明一个变量的时候可以直接赋值为NULL。
在下列情况下一个变量被认为是NULL:

  • 被赋值为NULL
  • 尚未被赋值
  • 被unset()

Callback / Callable 类型

自PHP5.4起,可以用callable类型指定回调类型callback。
一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

数据类型之间的相互转换

数据从一种类型转换到另一种类型,就是数据类型转换。在PHP中,有两种常见的转换方式:自动数据类型转换和强制数据类型转换。
PHP 在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个 string 值赋给变量                            v                    a                    r                    ,                         var,              varvar 就成了一个 string。如果又把一个integer 赋给 $var,那它就成了一个integer。

  1. 自动数据类型转换
    这种转换方法最为常用,直接输入数据的转换类型即可。例如,float型转换为整型int型,小数点后面的数将被舍弃。如果float数值超过了整数的取值范围,则结果可能是0或者整数的最小负数。

自动转换为 数组 的行为目前没有定义。

示例

<?php $foo = "1";  // $foo 是字符串 (ASCII 49)$foo *= 2;   // $foo 现在是一个整数 (2)$foo = $foo * 1.3;  // $foo 现在是一个浮点数 (2.6)$foo = 5 * "10 Little Piggies"; // $foo 是整数 (50)$foo = 5 * "10 Small Pigs";     // $foo 是整数 (50)?>
  1. 强制数据类型转换
    PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型。
<?php $foo = 10;   // 定义一个整型变量$bar = (boolean) $foo;   // 强制转换为布尔型?>

允许的强制转换有:

  • (int), (integer) - 转换为整形 integer
  • (bool), (boolean) - 转换为布尔类型 boolean
  • (float), (double), (real) - 转换为浮点型 float
  • (string) - 转换为字符串 string
  • (array) - 转换为数组 array
  • (object) - 转换为对象 object
  • (unset) - 转换为 NULL (PHP 5)

(binary) 转换和 b 前缀转换支持为 PHP 5.2.1 新增。

<?php $binary = (binary)$string;$binary = b"binary string";?>

可以将变量放置在双引号中的方式来代替将变量转换成字符串:

<?php $foo = 10;	//定义整型变量$str = "$foo";	// 强制转换为string类型$fst = (string)$foo;	//强制转换为string类型// 输出 "they are the same"if ($fst === $str) {
	echo "they are the same";}?>

在PHP中,如果要改变一个变量的类型,可以使用settype函数强制转换数据类型,基本语法如下:

Bool settype(var, string type)

其中type的可能值不能包含资源类型数据。
示例

<?php $var1 = 1.86;	// 定义浮点型数据echo settype($var1, "int");	// 强制转换为整数输出?>

转换为布尔值

要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。
当转换为 boolean 时,以下值被认为是 FALSE:

  • 布尔值 FALSE 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 空字符串,以及字符串 “0”
  • 不包括任何元素的数组
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象

所有其它值都被认为是 TRUE(包括任何资源 和 NAN)。
*** -1 和其它非零值(不论正负)一样,被认为是 TRUE! ***

<?phpvar_dump ((bool) "");	// bool(false)var_dump((bool) 1);		// bool(true)var_dump((bool) -1);	// bool(true)var_dump((bool) -2);	// bool(true)var_dump((bool) "foo");	// bool(true)var_dump((bool) 2.3e5);	// bool(true)var_dump((bool) array(12));	// bool(true)var_dump((bool) array());	// bool(false)var_dump((bool) "false");	// bool(true)?>

转换为整型

값을 명시적으로 정수로 변환하려면 (int) 또는 (integer) 캐스트를 사용하세요. 그러나 대부분의 경우 연산자, 함수 또는 흐름 제어에 정수 매개변수가 필요한 경우 값이 자동으로 변환되므로 캐스팅이 필요하지 않습니다. intval() 함수를 사용하여 값을 정수 유형으로 변환할 수도 있습니다.

리소스를 정수로 변환하면 결과는 PHP 런타임에 의해 리소스에 할당된 고유한 리소스 번호가 됩니다.

  1. 부울 값에서 변환
    FALSE는 0(영)을 생성하고 TRUE는 1(1)을 생성합니다.

  2. Convert from Float
    부동 소수점 숫자를 정수로 변환하면 반내림됩니다.
    부동 소수점 수가 정수 범위를 초과하는 경우(일반적으로 32비트 플랫폼에서는 +/- 2.15e+9 = 2^31, Windows를 제외한 64비트 플랫폼에서는 +/- 9.22e+18 = 2^63), 정확한 정수 결과를 제공하기에는 정밀도가 충분하지 않기 때문에 결과가 정의되지 않았습니다. 이 경우 경고나 알림도 없습니다!
    PHP 7.0.0부터 NaN 및 Infinity는 정수로 변환될 때 더 이상 정의되지 않거나 플랫폼에 종속되지 않지만 0이 됩니다.

  3. 문자열에서 변환
    문자열을 숫자 값으로 처리하는 경우 결과와 유형은 다음과 같습니다.
    문자열에 '.', 'e' 또는 'E' 및 해당 숫자 값이 포함되지 않은 경우 범위의 정수(PHP_INT_MAX로 정의됨)인 경우 문자열은 정수로 처리됩니다. 다른 모든 경우에는 값이 부동소수점으로 처리됩니다.
    문자열의 시작 부분에 따라 값이 결정됩니다. 문자열이 유효한 숫자 값으로 시작하는 경우 해당 숫자 값이 사용됩니다. 그렇지 않으면 해당 값은 0(영)입니다. 유효한 값은 선택적 기호, 그 뒤에 하나 이상의 숫자(소수점이 있을 수 있음), 선택적 지수 부분으로 구성됩니다. 지수 부분은 'e' 또는 'E' 뒤에 하나 이상의 숫자가 오는 것으로 구성됩니다.

  4. 다른 유형에서 변환
    다른 유형을 정수로 변환하는 데 정의된 동작은 없습니다. 예고 없이 변경될 수 있으므로 기존 동작에 의존하지 마십시오.

부동소수점으로 변환

문자열 유형이 아닌 값의 경우, 값을 먼저 정수로 변환한 다음 부동소수점으로 변환하는 것과 비슷한 상황입니다. PHP 5부터 객체를 부동 소수점 숫자로 변환하려고 하면 E_NOTICE 오류 메시지가 표시됩니다.

문자열로 변환

값은 앞에 (문자열)을 붙이거나 strval() 함수를 사용하여 문자열로 변환할 수 있습니다. 문자열이 필요한 표현식에서는 자동으로 문자열로 변환됩니다. 예를 들어 이 변환은 echo 또는 print 함수를 사용하거나 변수를 문자열과 비교할 때 발생합니다.

TRUE의 부울 값은 "1" 문자열로 변환됩니다. 부울 FALSE는 ""(빈 문자열)로 변환됩니다. 이 변환은 부울과 문자열 간에 수행될 수 있습니다.

정수 또는 부동 소수점은 숫자 리터럴 스타일 문자열(부동 소수점의 지수 부분 포함)로 변환됩니다. 지수 표기법(4.1E+6)을 사용하는 부동 소수점 숫자도 변환할 수 있습니다.

Array 배열은 항상 "Array" 문자열로 변환되므로 echo 및 print는 배열의 내용을 표시할 수 없습니다. 특정 단위를 표시하려면 echo $arr['foo'] 구조를 사용할 수 있습니다.

PHP 4에서는 객체 객체가 항상 "Object"라는 문자열로 변환되어 객체의 클래스 이름을 얻으려면 get_class() 함수를 사용할 수 있습니다. PHP 5부터 적절한 경우 __toString 메소드를 사용할 수 있습니다.

리소스 리소스는 항상 "리소스 ID #1" 구조의 문자열로 변환됩니다. 여기서 1은 런타임 시 PHP가 리소스에 할당한 고유 값입니다. 이 구조에 의존하지 마십시오. 변경될 수 있습니다. 리소스 유형을 얻으려면 get_resource_type() 함수를 사용할 수 있습니다.

NULL은 항상 빈 문자열로 변환됩니다.

배열, 개체 또는 리소스를 문자열로 직접 변환하면 해당 유형을 제외한 유용한 정보를 얻을 수 없습니다. 이러한 유형의 콘텐츠는 print_r() 및 var_dump() 함수를 사용하여 나열할 수 있습니다.

대부분의 PHP 값은 영구 저장을 위해 문자열로 변환될 수 있으며 이를 직렬화라고 하며 serialize() 함수를 사용하여 달성할 수 있습니다. PHP 엔진이 WDDX를 지원하도록 구성된 경우 PHP 값을 올바른 형식의 XML 텍스트로 직렬화할 수도 있습니다.

转换为数组

对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)                            s                    c                    a                    l                    a                    r                    V                    a                    l                    u                    e                    与                    a                    r                    r                    a                    y                    (                         scalarValue 与 array(              scalarValuearray(scalarValue) 完全一样。

如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*’ 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:

<?phpclass  A {
	private $A;		// 这将变成&#39;\0A\0A&#39;}class B extends A {
	private $A;		// 它将变成&#39;\0B\0A&#39;
	public $AA;		// 它将变成‘AA’}var_dump((array) new B());?>

以上代码输出结果为:
PHP7 언어 기본에 대한 자세한 설명

将 NULL 转换为 array 会得到一个空的数组。

可以用 array_diff() 和数组运算符来比较数组。

转换为对象

如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类stdClass的实例。如果该值为NULL,则新的实例为空。 array转换成object将使键名成为属性名并具有相对应的值。

<?php $obj = (object)array(&#39;1&#39; => 'foo');// PHP7.2之后的版本输出'bool(tru)',之前版本会输出'bool(false)'var_dump(isset($obj->{'1'}));var_dump(key($obj));  //PHP7.2后输出'string(1) "1"',之前输出'int(1)'?>

对于其他值,会包含进成员变量名 scalar。

<?php $obj = (object)&#39;ciao&#39;;echo $obj->scalar;    // 输出'ciao'?>

转换为资源

由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。

转换到NULL

使用(unset)$var将一个变量转换为NULL将不会删除该变量或者unset其值。仅是返回NULL值而已。

标量类型的声明

在默认情况下,所有的PHP文件都处于弱类型校验模式。PHP7加了标量类型声明特性,标量类型声明有两种模式:强制模式(默认)和严格模式。
标量类型声明语法格式如下:

declare(strict_types=1);

PHP默认情况下是弱类型校验模式,在php7下declare新增了strict_types指令,通过设置strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。默认为强制模式,即弱类型校验模式

可以声明标量类型的参数类型包括int、float、bool、string、interfaces、array和callable。

注意:declare(strict_types=1)必须是文件的第一个语句。如果这个语句出现在文件的其他地方,将会产生一个编译错误,块模式是被严格禁止的。

  1. 强制模式(弱类型校验模式)
<?php // 默认情况function sum(int $ints){
	return array_sum($ints);}print(sum(2, &#39;3&#39;, 4.1));

以上程序输出结果为9.代码中的4.1先转换为整数4,然后再进行相加操作。

  1. 严格模式
<?php // 严格模式declare(strict_types=1);function sum(int $ints) {
	return array_sum($ints);}print(sum(2, &#39;3&#39;, 4.1));?>

以上程序采用了严格模式,因此如果参数中出现的不是整数类型,程序执行时就会报错。

运算符

算术运算符

算术运算符是最简单、最常用的的运算符。常见的算术运算符如下表:

의 합 ​​                                                               에이                                                 그리고                                                                 a와 a                   a과 b 의 제품 ​​                                                               에이                                                 그리고                                                                 a와 a                   a의 몫 ​​                                                               에이                                                 제거하다                                                 에 의해                                                               로 나누기                         a할당 연산자의 의미
Example Operator Name Result
-$a - 부정 연산자 $a
$a + $b + 덧셈 연산자 ​​                                                               에이                                                 그리고                                                                 a와 a                   ab
b 의 차이점 ​​                                                               에이                                                 그리고                                                                 a와 a                   a
b$a % $b%변조 연산자
제외 ~ b
$a ** $b ** Power 연산자 의 나머지 연산자는 PHP5.6부터 새로 추가되었으며 결과는 입니다. ​​                                                               에이                                                 의                                                                                                               나누기 연산자는 항상 부동 소수점 숫자를 반환합니다. 유일한 예외는 두 피연산자가 모두 정수(또는 문자열에서 변환된 정수)이고 정확하게 나눌 수 있는 경우입니다. 이 경우 정수를 반환합니다. 모듈로 연산자의 피연산자는 연산 전에 정수(소수 부분 제외)로 변환됩니다. 모듈로 연산자 %의 결과는 배당금의 부호(sign)와 같습니다. 즉, $a % $b의 결과는 $a와 동일한 부호를 갖습니다. 대입 연산자기본 대입 연산자(=)는 특정 데이터 값을 특정 변수에 적재할 때, 즉 오른쪽 표현식의 값을 왼쪽 피연산자에 대입할 때 사용됩니다. 할당 연산자를 결합하면 해당 값을 표현식에 사용할 수 있으며 .

할당 연산자

의미


=$a += 5,相当于$a = $a + 5

오른쪽 값을 왼쪽 변수에 할당

+=왼쪽 값과 오른쪽 값을 왼쪽 변수에 할당왼쪽 값 할당 오른쪽 값을 빼고 왼쪽 변수에 할당
-=
*= 왼쪽 값에 오른쪽 값을 곱하여 왼쪽 변수에 할당 left
/= 왼쪽 값을 오른쪽 값으로 나눕니다 왼쪽 변수에 할당
.= 왼쪽 문자열을 오른쪽으로 연결
% = 왼쪽 값의 나머지 부분을 오른쪽 값에 왼쪽 변수에 할당합니다

비트 연산자

비트 연산자를 사용하면 정수의 지정된 비트를 평가하고 연산할 수 있습니다. 일반적인 비트 연산자는 다음과 같습니다:

이 됩니다. ​​                                                             에이                                                 그리고                                                             a와 a                   中A 및 任何B는 1 b 비트를 설정하여 하나는 1이고 다른 하나는 0에서 1~$a ​​                                                             에이                                                 가운데                                                 의                                                 조금                                                 향해                                                 왼쪽                                                 이동하다                                                 이동하다                                                             a의 비트를 왼쪽으로 이동합니다.                   의
비트 연산자 이름 Result
$a & $b & 그리고 (비트 AND) 를 넣습니다. ​​                                                             에이                                                 그리고                                                             a와 a                   中a 및 DUB는 모두 1 $ a | $ b | 또는 (위치에 따라)
$ a ^ $ B ^ xor 으로 설정됩니다. ​​                                                             에이                                                 그리고                                                             a와 a                   a
~Not(비트 부정) 세트 $a의 0비트를 1로 설정하고 1비트를 0$a 왼쪽으로 이동(왼쪽으로 이동)will
a
비트 왼쪽으로 b번 이동합니다(각 이동은 둘 다 "2 곱하기"를 의미함).
$a >> $b >> 오른쪽으로 이동(오른쪽으로 이동) will ​​                                                             에이                                                 가운데                                                 의                                                 조금                                                 향해                                                 오른쪽                                                 이동하다                                                 이동하다                                                             a의 비트를 오른쪽으로 이동                   a in bit 에서 rightb번 이동합니다(각 이동은 "2로 나누기"를 의미) )

변위는 PHP의 수학 연산입니다. 어떤 방향으로든 밖으로 이동한 비트는 폐기됩니다. 왼쪽으로 이동하면 오른쪽이 0으로 채워지고 부호 비트가 멀리 이동합니다. 즉, 부호가 유지되지 않습니다. 오른쪽으로 이동하면 왼쪽이 부호 비트로 채워지므로 부호가 유지됩니다.

비교 연산자

비교 연산자는 양쪽 끝의 데이터 값의 크기를 비교하는 데 사용됩니다. 비교 연산자의 구체적인 의미는 다음과 같습니다.

$ a == $ b$a === $b$a != $b입니다. $a ​​                                                             에이                                                 아니요                                                 기다리다                                                 에                                                             a는 같지 않다                   보다 큽니다. 입니다. 입니다.
examples eroperator name result
== equals 이후 유형 변환 이후 ​​                                                             에이                                                 기다리다                                                 그리고                                                             등등                   aetcb, 결과는 TRUE
=== congruent 만약 ​​                                                             에이                                                 기다리다                                                 에                                                             a는 다음과 같다                   aetcb와 같고 해당 유형도 동일하므로 결과는 TRUE
!=같지 않음 유형 변환 후 ​​                                                             에이                                                 아니요                                                 기다리다                                                 에                                                             a는 같지 않다                   a 기다리지 않고 b하면 결과는 TRUE
기다리지 마세요 유형이 변환된 경우 a기다려forb, 결과는 TRUE
$a !== $b !== not congruent if ​​                                                             에이                                                 아니요                                                 기다리다                                                 에                                                             a는 같지 않다                   ab와 같지 않거나 유형이 다르면 결과는 TRUE
$a &입니다. lt; 미만 If ​​                                                             에이                                                 얀                                                 그리드                                                 작은                                                 에                                                             a는 다음보다 엄격하게 작습니다.                   ayanGeyub, 결과는 TRUE
$a > ; 만약 ​​                                                             에이                                                 얀                                                 그리드                                                 큰                                                 에                                                             a는 다음보다 엄격하게 크다                   ;b, 결과는 TRUE입니다.
$a 인 경우 보다 작거나 같습니다. ​​                                                                 에이                                                 작은                                                 에                                                 또는                                                                                                                         기다리다                                                 에                                                                 a는 다음보다 작거나 같습니다.                     asmallyu 또는 oretcyub, 결과는 TRUE
$a >= $b > ; = 보다 크거나 같음 ​​                                                                 에이                                                 큰                                                 에                                                 또는                                                                                                                         기다리다                                                 에                                                                 a는 다음보다 크거나 같습니다.                     a보다 크거나 등, b보다 크면 결과는 TRUE
$a $b 우주선 연산자(조합 비교 연산자) when ​​                                                                 에이                                                 작은                                                 에                                                 , ,                                                 기다리다                                                 에                                                 , ,                                                 큰                                                 에                                                                 a는 보다 작거나, 같거나, 크다                     ​ ab时,分别返回一个小于、等于、大于0的integer值。PHP7开始提供。
$a ?? $b ?? $c ?? ?? NULL合并操作符 从左往右第一个存在且不为NULL的操作数。如果都没有定义且不为NULL,则返回NULL。PHP7开始提供

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。

<?php // Integersecho 1 <=> 1;		// 0echo "<br>";echo 1  2;		// -1echo "<br>";echo 2  1;		//1echo "<br>";// Floatsecho 1.5  1.5;	// 0echo "<br>";echo 1.5  2.5;	// -1echo "<br>";echo 2.5  1.5;	// 1echo "<br>";// Stringsecho "a"  "a";	//0echo "<br>";echo "a"  "b";	// -1echo "<br>";echo "b"  "a";	// 1echo "<br>";echo "a"  "aa";	// -1echo "<br>";echo "zz"  "aa";	// 1echo "<br>";// Arraysecho []  [];		// 0echo "<br>";echo [1, 2, 3]  [1, 2, 3];	// 0echo "<br>";echo [1, 2, 3]  [];	// 1echo "<br>";echo [1, 2, 3]  [1, 2, 1];	// 1echo "<br>";echo [1, 2, 3]  [1, 2, 4];	// -1echo "<br>";// Objects$a = (object)["a" => "b"];$b = (object)["a" => "b"];echo $a  $b;		// 0echo "<br>";$a = (object)["a" => "b"];$b = (object)["a" => "c"];echo $a  $b;		// -1echo "<br>";$a = (object)["a" => "c"];$b = (object)["a" => "b"];echo $a  $b;		// 1echo "<br>";// 只进行值的比较$a = (object)["a" => "b"];$b = (object)["b" => "b"];echo $a  $b;		// 1echo "<br>";?>

对于多种类型,比较运算符根据下表比较(按顺序)。

运算数1类型 运算数2类型 结果
null或string string 将NULL转换为"",进行数字或词汇比较
bool或null 任何其他类型 转换为bool,FALSE
object object 内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP4),PHP5中当使用比较运算符()比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。 而如果使用全等运算符(=),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。
string,resource或number string,resource或number 将字符串和资源转换成数字,按普通数学比较
array array 具有较少成员的数组较小,如果运算数1中的键不存在与运算数2中则数组无法比较,否则挨个值比较
object 任何其他类型 object总是更大
array 任何其他类型 array总是更大

증가/감소 연산자

PHP는 C 스타일 사전/사후 증가 및 감소 연산자를 지원합니다.

뒤에 추가하세요.
이름 Effect
++$a Prepend ​​                                                                 에이                                                 의                                                 값                                                 추가하다                                                 1                                                 ,                                                                                                                         뒤쪽에                                                 반품                                                 반품                                                                 a의 값에 1을 더하고 반환                     a + 1, 다음 반환 반환 a
$a++ 반품 ​​                                                                 에이                                                 ,                                                                                                                         뒤쪽에                                                 할 것이다                                                                 가, 그리고 나서                     ​ a, ranafter will더하기 1
–$a 빼기 의 값 ​​                                                                 에이                                                 의                                                 값                                                 줄이다                                                 1                                                 ,                                                                                                                         뒤쪽에                                                 반품                                                 반품                                                                 a의 값을 1만큼 감소시키고 반환                     a 빼기 1, 반환 반환 a
$a– 이후 적게 반품 ​​                                                                 에이                                                 ,                                                                                                                         뒤쪽에                                                 할 것이다                                                                 가, 그리고 나서                     ​​ a, ranthen a 값을 1
만큼 감소시킵니다.

증가/감소 연산자는 부울 값에 영향을 주지 않습니다. NULL 값을 감소시키면 아무런 효과가 없지만 NULL을 증가시키면 1이 됩니다.
자동 증가 연산을 수행할 수 있는 숫자 값 외에도 캐릭터도 자동 증가 연산을 수행할 수 있습니다. 예를 들어 b++의 경우 결과는 c와 같습니다. 문자 변수는 증가할 수만 있고 감소할 수 없으며 순수 문자(a-z 및 A-Z)만 지원됩니다. 다른 문자 변수의 증가/감소는 유효하지 않으며 원래 문자열은 변경되지 않습니다.

논리 연산자

프로그래밍 언어의 가장 중요한 기능 중 하나는 논리적인 판단과 연산을 수행하는 것입니다. 논리 연산자의 의미는 다음 표와 같습니다.

!$a$a && $b$a || $b
Example Operator Name Result
$a 및 $b and And(논리적 AND) if ​​                                                                 에이                                                 그리고                                                                 a와 a                     ​ ab는 모두 true이고 결과는 true입니다.
$a 또는 $b or 또는 (논리적 OR) if ​​                                                                 에이                                                 또는                                                                 또는                     a 또는 b가 true이면 결과도 true
$a xor $b xor Xor(논리적 or) If ​​                                                                 에이                                                 아니요                                                 같은                                                 에                                                                 a는 와 다르다                     ab와 동일하지 않으며 결과는 true
! 않습니다( 논리적 부정) If $a가 참이 아니고 결과가 참입니다
&& 그리고 (논리적 AND) if ​​                                                                 에이                                                 그리고                                                                 a와 a                     ab는 모두 true이고 결과는 true입니다.
|| (논리적 OR) if ​​                                                                 에이                                                 또는                                                                 또는                     ~a 또는 b가 true이면 결과는 true
입니다.

"与"和"或"有两种不同形式运算符的原因是它们运算的优先级不同。

字符串运算符

有两个字符串(string)运算符。第一个是连接运算符("."),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(".="),它将右边参数附加到左边的参数之后。

错误控制运算符

PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

如果用set_error_handler()设定了自定义的错误处理函数,仍然会被调用,但是此错误处理函数可以调用error_reporting(),而该函数在出错语句前有@时将返回0。

如果激活了track_errors特性,表达式所产生的任何错误信息都被存放在变量 $php_errormsg中。此变量在每次出错时都会被覆盖,所以如果想用它的话就要尽早检查。

@运算符只对表达式有效。一个简单的规则就是:如果能从某处得到值,就能在它前面加上@运算符。例如,可以把它放在变量,函数和include调用,常量,等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。
***目前的"@“错误控制运算符前缀甚至使导致脚本终止的严重错误的错误报告也失效。这意味着如果在某个不存在或者敲错了字母的函数调用前用了”@"来抑制错误信息,那脚本会没有任何迹象显示原因而死在那里。 ***

执行运算符

PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符"`"的效果与函数 shell_exec() 相同。

反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。
与其它某些语言不同,反引号不能在双引号字符串中使用。

<?php $output = `ping 127.0.0.1`;echo "<pre class="brush:php;toolbar:false">$output
";?>

数组运算符

数组支持的运算符如下表所示:

이름 Result
$a + $b Union ​​                                                             에이                                                 그리고                                                             a와 a                               ab의 연합.
$a == $b equal if ​​                                                                 에이                                                 그리고                                                                 a와 a                     ​​ ab는 동일한 키/값 쌍
$a === $b Congruent if을 갖는 경우 TRUE입니다. ​​                                                                 에이                                                 그리고                                                                 a와 a                     ab가 동일한 키/값 쌍을 갖고 동일한 순서와 유형
$a != $b 같지 않음 if인 경우 TRUE입니다. ​​                                                                 에이                                                 아니요                                                 기다리다                                                 에                                                                 a는 같지 않다                           anot etcb와 같지 않으며 TRUE
$a 만약 ​​                                                                 에이                                                 아니요                                                 기다리다                                                 에                                                                 a는 같지 않다                     a기다려forb는 TRUE
$a !== $b 같지 않음 if ​​                                                                 에이                                                 아니요                                                 완벽한                                                 기다리다                                                 에                                                                 a는 정확히 같지 않습니다.                     a아니라 alletc in b가 TRUE

+运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。

数组中的单元如果具有相同的键名和值则比较时相等。

类型运算符

instanceof用于确定一个PHP变量是否属于某一类class的实例:

<?phpclass  MyClass {}class NotMyClass {}$a = new MyClass;var_dump($a instanceof MyClass);var_dump($a instanceof NotMyClass);?>

以上程序会输出:

bool(true)
bool(false)

instanceof 也可用来确定一个变量是不是继承自某一父类的子类的实例:

<?phpclass  ParentClass{}class MyClass extends ParentClass{}$a = new MyClass;var_dump($a instanceof MyClass);var_dump($a instanceof ParentClass);?>

以上程序会输出:

bool(true)
bool(true)

检查一个对象是否不是某个类的实例,可以使用逻辑运算符 not。

<?phpclass  MyClass{}$a = new MyClass;var_dump(!($a instanceof stdClass));?>

以上程序输出:

bool(true)

instanceof也可用于确定一个变量是不是实现了某个接口的对象的实例:

<?phpinterface  MyInterface{}class MyClass implements MyInterface{}$a = new MyClass;var_dump($a instanceof MyClass);var_dump($a instanceof MyInterface);?>

以上程序输出:

bool(true)
bool(true)

如果被检测的变量不是对象,instanceof 并不发出任何错误信息而是返回 FALSE。不允许用来检测常量。

三元运算符

三元运算符作用在三个操作数之间,这样的操作符在PHP中只有一个,即“?:”,语法形式如下:

(expr1)?(expr2):(expr3)

表达式(expr1) ? (expr2) : (expr3) 在 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。

自PHP5.3起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。

建议避免将三元运算符堆积在一起使用。当在一条语句中使用多个三元运算符时会造成 PHP 运算结果不清晰.
三元运算符是个语句,因此其求值不是变量,而是语句的结果。在一个通过引用返回的函数中语句 return $var == 42 ? $a : $b; 将不起作用。

运算符优先级

运算符的优先级和结合规则与正常的数学运算十分相似。

如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-“是左联的,那么 1 - 2 - 3 就等同于 (1 - 2) - 3 并且结果是 -4. 另外一方面,”="是右联的,所以 $a = $b = $c 等同于                            a                    =                    (                         a = (              a=(b = $c)。

没有结合的相同优先级的运算符不能连在一起使用,例如 1 1 在PHP是不合法的。但另外一方面表达式 1

括号的使用,哪怕在不是必要的场合下,通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。

运算符优先级

结合方向 运算符
clone、new
[
**
++、–、~、(int)、(float)、(string)、(array)、(object)、(bool)、 @
instanceof
!
*、/、%
+、-、.
>
、>=
、!=、=、!==、、
&
^
|
&&
||
??
?:
=、+=、-+、*=、**=、/=、.=、%=、&=、|=、^=、>=
and
xor
or

Expression

표현식은 특정 작업이나 동작을 특정 언어로 표현하는 문입니다. 표현식은 "피연산자"와 "연산자"로 구성됩니다. 피연산자는 변수 또는 상수일 수 있습니다. 연산자는 논리적 판단, 할당, 연산 등 표현하고자 하는 행위를 구현합니다.

PHP 코드에서는 ";" 기호를 사용하여 표현식, 즉 표현식과 세미콜론이 PHP 문을 구성합니다.

PHP는 거의 모든 것이 표현이라는 점에서 표현 지향 언어입니다.

위 내용은 PHP7 언어 기본에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제