>  기사  >  백엔드 개발  >  유형 - PHP 매뉴얼 참고사항

유형 - PHP 매뉴얼 참고사항

WBOY
WBOY원래의
2016-08-08 09:29:29970검색

유형소개

PHP는 8가지 기본 데이터 유형을 지원합니다.

  • 4가지 스칼라 유형:

    • 부울(부울, 대소문자 구분)
    • 정수(정수형)
    • float(부동 소수점 유형, double이라고도 함)
    • 문자열(string)
  • 두 가지 복합 유형:

    • 어레이(어레이)
    • 객체
  • 마지막으로 두 가지 특별한 유형이 있습니다:

    • 리소스
    • NULL(유형 없음)

표현식의 값과 종류를 확인하고 싶다면 var_dump() 함수를 사용해보세요.

<code><?php 
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);

$b = 3.1;
$c = true;
var_dump($b, $c);</code>

위 코드는 var_dump()을 통해 변수의 관련 정보를 출력하고, 출력 결과는 다음과 같습니다(PHP 버전 5.5.12).

<code>array (size=3)
  0 => int 1
  1 => int 2
  2 => 
    array (size=3)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)
      2 => string 'c' (length=1)

float 3.1

boolean true</code>

디버깅을 위해 사람이 읽을 수 있는 형식 표현을 원하는 경우 gettype() 함수를 사용하세요. 특정 유형을 보려면 gettype()을 사용하지 말고 is_type 기능을 사용하세요. 매개변수를 필터링하려면 is_type을 사용하세요.

변수를 특정 유형으로 강제 지정하려면 캐스트나 settype() 함수를 사용할 수 있습니다. 변수는 당시의 유형에 따라 특정 상황에서 다른 값을 가질 수 있습니다.

부울 유형

부울로 변환할 때 다음 값은 FALSE로 간주됩니다.

  • 빈 문자열, 문자열 "0"
  • 요소가 없는 배열

객체인 경우 반환 값은 TRUE입니다.

다음 프로그램은 부울 유형 변환에 대한 이해를 깊게 할 수 있습니다.

<code><?php 
var_dump((bool) array());  // boolean false
var_dump((bool) "");  // boolean false
var_dump((bool) "0");  // boolean false
var_dump((bool) "00");  // boolean true
var_dump((bool) "false");  // boolean true
var_dump((bool) (new stdClass()));  // boolean true
var_dump((bool) ((object) array()));  // boolean true</code>

정수

8진수 표현을 사용하려면 숫자 앞에 0(영)을 추가해야 합니다.
16진수 표현을 사용하려면 숫자 앞에 0x를 추가해야 합니다.
이진수식을 사용하려면 숫자 앞에 0b를 추가해야 합니다.
이진수 표현 정수는 PHP 5.4.0부터 사용할 수 있습니다.

정수값의 단어 길이는 상수 PHP_INT_SIZE로 표현할 수 있고, 최대값은 상수 PHP_INT_MAX로 표현할 수 있습니다.

<code><?php 
var_dump(PHP_INT_SIZE);  // int 4
var_dump(PHP_INT_MAX);  // int 2147483647
var_dump(01090);  // int 8  八进制 010 = 十进制 8</code>

위 프로그램의 마지막 문장에서 8진수를 처리할 때 이상한 일이 일어났습니다. 그 이유는 잘못된 숫자(예: 8 또는 9)를 8진수에 전달하면 나머지 숫자는 무시되기 때문입니다.

주어진 숫자가 정수 범위를 초과하면 부동소수점으로 해석됩니다. 마찬가지로 연산 결과가 정수 범위를 초과하면 float가 반환됩니다.

PHP에는 정수 나누기 연산자가 없습니다. 1/2는 float 0.5를 생성합니다. 값을 정수로 캐스팅하거나, 소수 부분을 버리거나, 더 나은 반올림을 위해 round() 함수를 사용할 수 있습니다.

설명서에는 알 수 없는 분수를 정수로 변환하지 말라고 나와 있습니다. 이는 때때로 예측할 수 없는 결과를 초래할 수 있기 때문입니다.

<code><?php 
echo (int)((0.1 + 0.7) * 10);</code>

이 프로그램의 출력 결과는 7입니다. 부동 소수점 숫자는 절대 믿지 마세요!

플로트

특정 수학 연산은 상수 NAN로 표시되는 결과를 생성합니다. 이 결과는 부동 소수점 연산에서 정의되지 않았거나 표현할 수 없는 값을 나타냅니다. 이 값을 다른 값과 느슨하게 또는 엄격하게 비교하면 FALSE가 됩니다.

끈끈

문자열은 일련의 문자로 구성되며 각 문자는 1바이트에 해당합니다. 구현은 버퍼 길이를 지정하는 정수와 바이트 배열입니다. 즉, PHP는 256개의 문자 집합만 지원할 수 있으므로 유니코드는 지원하지 않습니다. 중국어는 어떻게 표시되나요? 먼저 질문을 적어보세요.

문자열에는 4가지 문법 표현이 있습니다.

  • 작은따옴표
  • 큰따옴표
  • 여기문서
  • nowdoc

작은따옴표

작은따옴표 자체를 표현하려면 앞에 백슬래시()를 추가하여 이스케이프 처리해야 합니다.
백슬래시 자체를 표현하려면 백슬래시()를 두 개 사용합니다.
다른 백슬래시는 백슬래시 자체로 처리됩니다.

그런데 작은따옴표로 묶인 문자열에 백슬래시가 하나만 있으면 백슬래시도 출력됩니다. 왜 그럴까요?

큰따옴표

이스케이프 문자를 구문 분석할 수 있습니다. 가장 중요한 기능은 변수가 구문 분석된다는 것입니다.

작은따옴표와 큰따옴표 모두 여러 줄의 문자열 입력을 지원합니다.

heredoc 구조

이 구조는 이전 프로그래밍에서는 거의 사용되지 않았습니다. 여기서 이에 대해 자세히 알아 보겠습니다.

구조는 대략 다음과 같습니다.
<<< 연산자 다음에 식별자를 제공하고 줄바꿈을 입력합니다.
다음은 문자열 자체입니다.
마지막으로 이전에 정의한 식별자를 끝 표시로 사용합니다.

끝에 인용된 식별자는 줄의 첫 번째 열에 있어야 합니다. 즉, 식별자를 들여쓸 수 없으며 줄에는 세미콜론(;)을 제외한 다른 문자가 포함되어서는 안 됩니다.

Heredocs 구조는 클래스 속성을 초기화하는 데 사용할 수 없습니다. PHP 5.3부터 이 제한은 heredoc에 변수가 포함된 경우에만 적용됩니다.

Heredoc 구조는 큰따옴표가 없는 큰따옴표 문자열과 같으며 이스케이프 규칙은 큰따옴표와 동일합니다.

nowdoc 구조

nowdoc 구조는 <<< 연산자 뒤에 오는 식별자를 작은따옴표로 묶어야 한다는 점을 제외하면 heredoc와 유사합니다.

就象heredoc结构类似于双引号字符串,nowdoc结构是类似于单引号字符串的。nowdoc中不进行解析操作。这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。nowdoc结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量。

变量解析

变量解析有两种语法规则,一种是简单规则,一种是复杂规则。简单规则最常用、最方便,这里详细学习一下复杂语法规则。复杂规则语法的显著标记是用花括号包围的表达式。

复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。 由于{无法被转义,只有$紧挨着{时才会被识别。

存取和修改

可以以数组形式访问字符串,用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。写入时只用到了赋值字符串的第一个字符。用空字符串赋值则赋给的值是NULL字符。PHP的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。

字符串可以用 '.'(点)运算符连接起来,注意 '+'(加号)运算符没有这个功能。

一个布尔值boolean的TRUE被转换成string的"1"。boolean的FALSE被转换成""(空字符串)。字符串转换为数值,该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。

PHP的优势就体现在字符串处理的方便上,对于string的操作有很多有用的函数,可以运用各种函数,还有正则表达式。

PHP 并不特别指明字符串的编码,字符串会被按照该脚本文件相同的编码方式来编码。因此,操作文本的函数必须假定字符串是如何编码的。不幸的是,PHP关于此的函数有很多变种,关于PHP的字符串处理函数还需多加学习。

array数组

PHP中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。

可以用array()语言结构来新建一个数组。它接受任意数量用逗号分隔的“键(key)=>值(value)对”。自5.4起可以使用短数组定义语法,用[]替代array()。key可以是integer或者string,value可以是任意类型。

key会有如下的强制转换和规则:

  • 包含有合法整型值的字符串会被转换为整型。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。
  • 布尔值也会被转换成整型。
  • null会被转换为空字符串,即键名null实际会被储存为""。
  • 数组和对象不能被用为键名。
  • 如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
  • 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。
<code><?php 
$a = array(&#39;20&#39; => 'a', '02' => 'b');
var_dump($a);</code>

通过上面的规则可知,这段代码的输出结果如下:

<code>array (size=2)
  20 => string 'a' (length=1)
  '02' => string 'b' (length=1)</code>

如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上1(但是最小为0)。要删除某键值对,对其调用unset()函数,该函数允许删除数组中的某个键,但要注意数组将不会重建索引。

<code><?php 
$a = array(&#39;a&#39;, &#39;b&#39; => 'b');
$a[] = 'c';
var_dump($a);
unset($a[1]);
var_dump($a);</code>

对于上面这段程序,输出为:

<code>array (size=3)
  0 => string 'a' (length=1)
  'b' => string 'b' (length=1)
  1 => string 'c' (length=1)

array (size=2)
  0 => string 'a' (length=1)
  'b' => string 'b' (length=1)</code>

应该始终在用字符串表示的数组索引上加上引号。例如用$foo['bar']而不是$foo[bar]。此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量。

foreach控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。

下面的示例程序,通过读取目录填充数组,这里涉及到几个函数的使用。

<code><?php 
$handle = opendir(&#39;.&#39;);
while(false !== ($file = readdir($handle))) {
	$files[] = $file;
}
closedir($handle);
var_dump($files);</code>

对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。

object对象

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

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

<code><?php 
class foo {
	function do_foo() {
		echo &#39;Doint foo.&#39;;
	}
}
$bar = new foo;
$bar->do_foo();
var_dump($bar);

$obj = (object) 'hello';
var_dump($obj);</code>

上面的示例程序输出结果为:

<code>Doint foo.object(foo)[1]

object(stdClass)[2]
  public 'scalar' => string 'hello' (length=5)</code>

resource资源类型

资源resource是一种特殊变量,保存了到外部资源的一个引用。资源使用的所有外部资源都会被垃圾回收系统释放,很少需要手工释放内存。但是,持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。

NULL

NULL类型只有一个值,就是不区分大小写的常量NULL。

callback回调类型

第一次接触到这个概念,有点陌生。

自PHP 5.4起可用callable类型指定回调类型callback。

手册示例程序中使用了很多call_user_func函数,先把这函数理一下。call_user_func把第一个参数作为回调函数(callback),并且将其余的参数作为回调函数的参数。返回回调函数的返回值,如果错误则返回FALSE。

回调函数可以是简单函数、对象方法、静态类方法,回调函数的几种使用方法如下所示:

  1. 调用用户自定义的简单函数,以string类型传递其名称。
<code><?php 
function my_callback_function() {
	echo 'hello, world.';
}
call_user_func('my_callback_function');</code>
  1. 调用类的静态成员方法,类及方法被作为数组传递,下标0包含该对象,下标1包含方法名。
<code><?php 
class MyClass {
	static function myCallbackMethod() {
		echo 'Hello, world.';
	}
}
call_user_func(array('MyClass', 'myCallbackMethod'));</code>
  1. 调用已实例化的对象方法。
<code><?php 
class MyClass {
	static function myCallbackMethod() {
		echo 'Hello, world.';
	}
}
$obj = new MyClass;
call_user_func(array($obj, 'myCallbackMethod'));</code>
  1. 调用静态类方法。
<code><?php 
class MyClass {
	static function myCallbackMethod() {
		echo 'Hello, world.';
	}
}
call_user_func('MyClass::myCallbackMethod');</code>
  1. 调用父类静态成员方法。
<code><?php 
class A {
	public static function who() {
		echo "A\n";
	}
}
class B extends A {
	public static function who() {
		echo "B\n";
	}
}
call_user_func(array('B', 'parent::who'));</code>

除了普通的用户自定义函数外,create_function()可以用来创建一个匿名回调函数。

类型转换

PHP是弱类型语言,变量类型根据使用该变量的上下文所决定的。

(全文完)

以上就介绍了类型 - PHP手册笔记,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:PHP 작업 JSON다음 기사:PHP 작업 JSON