수색…
정수
PHP의 정수는 기본 2 (2 진수), 8 진수 (8 진수), 10 진수 (10 진수) 또는 16 진수 (16 진수)로 지정 될 수 있습니다.
$my_decimal = 42;
$my_binary = 0b101010;
$my_octal = 052;
$my_hexadecimal = 0x2a;
echo ($my_binary + $my_octal) / 2;
// Output is always in decimal: 42
정수는 플랫폼에 따라 32 비트 또는 64 비트입니다. 상수 PHP_INT_SIZE
는 정수 크기 (바이트)를 포함합니다. PHP_INT_MAX
및 (PHP 7.0 이후) PHP_INT_MIN
도 사용할 수 있습니다.
printf("Integers are %d bits long" . PHP_EOL, PHP_INT_SIZE * 8);
printf("They go up to %d" . PHP_EOL, PHP_INT_MAX);
정수 값은 필요에 따라 부동 소수점, 부울 및 문자열에서 자동으로 생성됩니다. 명시 적 타입 변환이 필요하면 (int)
또는 (integer)
캐스트를 사용하여 수행 할 수 있습니다.
$my_numeric_string = "123";
var_dump($my_numeric_string);
// Output: string(3) "123"
$my_integer = (int)$my_numeric_string;
var_dump($my_integer);
// Output: int(123)
정수 오버플로는 float로 변환하여 처리됩니다.
$too_big_integer = PHP_INT_MAX + 7;
var_dump($too_big_integer);
// Output: float(9.2233720368548E+18)
PHP에는 정수 나누기 연산자가 없지만 암시 적 캐스트를 사용하여 시뮬레이션 할 수 있습니다. 암시 적 캐스트는 부동 소수점을 버리기 만하면 항상 '반올림'됩니다. PHP 버전 7부터는 정수 나누기 함수가 추가되었습니다.
$not_an_integer = 25 / 4;
var_dump($not_an_integer);
// Output: float(6.25)
var_dump((int) (25 / 4)); // (see note below)
// Output: int(6)
var_dump(intdiv(25 / 4)); // as of PHP7
// Output: int(6)
( (int)
이 나눗셈보다 우선 순위가 높으므로 (25 / 4)
주변의 여분의 괄호가 필요하다는 점에 유의하십시오)
문자열
PHP의 문자열은 네 가지 방법으로 지정할 수있는 일련의 싱글 바이트 문자 (즉, 유니 코드 유니 코드 지원이 없음)입니다.
단일 따옴표
거의 모든 것을 "있는 그대로"표시합니다. 변수와 대부분의 이스케이프 시퀀스는 해석되지 않습니다. 예외적으로 리터럴 작은 따옴표를 표시하려면 백 슬래시 '를 사용하여 이스케이프 처리하고 백 슬래시를 표시하려면 다른 백 슬래시를 사용하여 이스케이프 처리 할 수 있습니다.
$my_string = 'Nothing is parsed, except an escap\'d apostrophe or backslash. $foo\n';
var_dump($my_string);
/*
string(68) "Nothing is parsed, except an escap'd apostrophe or backslash. $foo\n"
*/
이중 따옴표
작은 따옴표로 묶인 문자열과 달리 문자열의 간단한 변수 이름과 이스케이프 시퀀스 가 평가됩니다. 복잡한 변수 이름을 분리하는 데는 중괄호 (마지막 예에서와 같이)를 사용할 수 있습니다.
$variable1 = "Testing!";
$variable2 = [ "Testing?", [ "Failure", "Success" ] ];
$my_string = "Variables and escape characters are parsed:\n\n";
$my_string .= "$variable1\n\n$variable2[0]\n\n";
$my_string .= "There are limits: $variable2[1][0]";
$my_string .= "But we can get around them by wrapping the whole variable in braces: {$variable2[1][1]}";
var_dump($my_string);
/*
string(98) "Variables and escape characters are parsed:
Testing!
Testing?
There are limits: Array[0]"
But we can get around them by wrapping the whole variable in braces: Success
*/
Heredoc
heredoc 문자열에서 변수 이름과 이스케이프 시퀀스는 큰 따옴표로 묶은 문자열과 비슷한 방식으로 구문 분석되지만 복잡한 변수 이름에는 중괄호를 사용할 수 없습니다. 문자열의 시작 부분은 <<<
identifier
로 구분되고 identifier
는 identifier
끝납니다. 여기서 identifier
는 유효한 PHP 이름입니다. 끝 식별자는 한 줄에 단독으로 나타나야합니다. 공백은 식별자 앞뒤에 허용되지 않지만 PHP의 모든 줄과 마찬가지로 세미콜론으로 끝나야합니다.
$variable1 = "Including text blocks is easier";
$my_string = <<< EOF
Everything is parsed in the same fashion as a double-quoted string,
but there are advantages. $variable1; database queries and HTML output
can benefit from this formatting.
Once we hit a line containing nothing but the identifier, the string ends.
EOF;
var_dump($my_string);
/*
string(268) "Everything is parsed in the same fashion as a double-quoted string,
but there are advantages. Including text blocks is easier; database queries and HTML output
can benefit from this formatting.
Once we hit a line containing nothing but the identifier, the string ends."
*/
Nowdoc
nowdoc 문자열은 가장 기본적인 이스케이프 시퀀스조차도 평가되지 않지만 heredoc의 작은 따옴표 버전과 같습니다. 문자열의 시작 부분에있는 식별자는 작은 따옴표로 묶습니다.
$my_string = <<< 'EOF'
A similar syntax to heredoc but, similar to single quoted strings,
nothing is parsed (not even escaped apostrophes \' and backslashes \\.)
EOF;
var_dump($my_string);
/*
string(116) "A similar syntax to heredoc but, similar to single quoted strings,
nothing is parsed (not even escaped apostrophes \' and backslashes \\.)"
*/
부울
부울 은 true
또는 false
표시된 두 개의 값이있는 유형입니다.
이 코드는 $foo
의 값을 true
하고 $bar
를 false
.
$foo = true;
$bar = false;
true
와 false
는 대소 문자를 구분하지 않으므로 TRUE
와 FALSE
사용할 수 있습니다. 심지어 FaLsE
도 가능합니다. 소문자 사용은 PSR-2 와 같은 대부분의 코드 스타일 가이드에서 가장 일반적이며 권장됩니다.
다음과 같은 if 문에서 부울을 사용할 수 있습니다.
if ($foo) { //same as evaluating if($foo == true)
echo "true";
}
사실 PHP가 약하게 입력 되었기 때문에 위의 $foo
가 true
또는 false
아닌 true
자동으로 부울 값으로 강제 변환됩니다.
다음 값은 false
.
- 0 값 :
0
(정수),0.0
(실수) 또는'0'
(문자열) - 빈 문자열
''
또는 배열[]
-
null
(설정되어 있지 않은 변수의 내용, 또는 변수에 할당 할 수있다)
다른 값은 true
됩니다.
이렇게 느슨한 비교를 피하기 위해 값 과 유형 을 비교하는 ===
사용하여 강력한 비교를 시행 할 수 있습니다. 자세한 내용은 유형 비교 를 참조하십시오.
유형을 부울로 변환하려면 유형 앞에 (bool)
또는 (boolean)
캐스트를 사용할 수 있습니다.
var_dump((bool) "1"); //evaluates to true
또는 boolval
함수를 호출하십시오.
var_dump( boolval("1") ); //evaluates to true
부울을 문자열로 변환합니다 ( false
는 빈 문자열을 생성합니다).
var_dump( (string) true ); // string(1) "1"
var_dump( (string) false ); // string(0) ""
부울을 정수로 변환 :
var_dump( (int) true ); // int(1)
var_dump( (int) false ); // int(0)
반대의 경우도 가능합니다.
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
또한 모두 0이 아닌 경우 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)
흙손
$float = 0.123;
역사적인 이유로 float의 경우
gettype()
에 의해 "double"이 반환되고 단순히 "float"가 아닌
float는 부동 소수점 숫자이므로 일반 정수보다 출력 정밀도가 높습니다.
부동 소수점 형과 정수형은 PHP의 가변형 변수 캐스팅 때문에 함께 사용할 수 있습니다.
$sum = 3 + 0.14;
echo $sum; // 3.14
PHP는 다른 언어와 마찬가지로 float 숫자를 float로 표시하지 않습니다. 예를 들면 다음과 같습니다.
$var = 1;
echo ((float) $var); //returns 1 not 1.0
경고
부동 소수점 정밀도
( PHP 매뉴얼 페이지에서 )
부동 소수점 숫자의 정밀도는 제한적입니다. 시스템에 따라 다르지만 PHP는 일반적으로 1.11e-16의 반올림으로 최대 상대 오차를 제공합니다. 초등 연산이 아닌 경우 더 큰 오류를 줄 수 있으며 여러 작업을 복합 할 때 오류 전파 를 고려해야합니다.
또한 0.1 또는 0.7과 같이 10 진수의 부동 소수점 숫자로 정확하게 표현할 수있는 유리수는 2 진수 (2 진수)의 부동 소수점 숫자로 정확하게 표현되지 않으며 내부적으로는 가수의 크기에 관계없이 사용됩니다 . 따라서 정밀도를 약간 떨어 뜨리지 않고 내부 바이너리로 변환 할 수 없습니다. 예를 들어 floor ((0.1 + 0.7) * 10)는 내부 표현이 7.999999999999911181과 같기 때문에 일반적으로 예상되는 8 대신 7을 반환합니다.
따라서 부동 소수점 결과를 마지막 숫자로 신뢰해서는 안되며 부동 소수점 숫자를 직접 비교하지 마십시오. 높은 정밀도가 필요한 경우 임의 정밀도 수학 함수와 gmp 함수를 사용할 수 있습니다.
호출 가능
호출 가능 객체는 콜백 호출 할 수있는 모든 것입니다. "콜백"이라고 할 수있는 것은 다음과 같습니다 :
익명 함수
표준 PHP 함수 (참고 : 언어 구조가 아님)
정적 클래스
비 정적 클래스 ( 대체 구문 사용 )
특정 객체 / 클래스 메소드
객체 자체가 배열의 키
0
에서 발견되는 한배열 요소로서 객체를 참조하는 예 :
$obj = new MyClass();
call_user_func([$obj, 'myCallbackMethod']);
콜백은 PHP 5.4에서 callable
유형 힌트 로 표시 할 수 있습니다.
$callable = function () {
return 'value';
};
function call_something(callable $fn) {
call_user_func($fn);
}
call_something($callable);
없는
PHP는 null
키워드로 "가치 없음"을 나타냅니다. 이것은 C 언어의 널 포인터와 SQL의 NULL 값과 다소 비슷합니다.
변수를 null로 설정 :
$nullvar = null; // directly
function doSomething() {} // this function does not return anything
$nullvar = doSomething(); // so the null is assigned to $nullvar
변수가 null로 설정되었는지 확인 :
if (is_null($nullvar)) { /* variable is null */ }
if ($nullvar === null) { /* variable is null */ }
Null과 정의되지 않은 변수
변수가 정의되지 않았거나 설정되지 않은 경우 null에 대한 모든 테스트가 성공적으로 수행되지만 Notice: Undefined variable: nullvar
도 생성됩니다 Notice: Undefined variable: nullvar
:
$nullvar = null;
unset($nullvar);
if ($nullvar === null) { /* true but also a Notice is printed */ }
if (is_null($nullvar)) { /* true but also a Notice is printed */ }
따라서 정의되지 않은 값은 isset
으로 검사해야합니다.
if (!isset($nullvar)) { /* variable is null or is not even defined */ }
유형 비교
두 가지 유형의 비교가 있습니다 . ==
와의 느슨한 비교 및 ===
와의 엄격한 비교 입니다. 엄격한 비교를 통해 연산자의 양쪽면의 유형과 값이 동일하게 유지됩니다.
// Loose comparisons
var_dump(1 == 1); // true
var_dump(1 == "1"); // true
var_dump(1 == true); // true
var_dump(0 == false); // true
// Strict comparisons
var_dump(1 === 1); // true
var_dump(1 === "1"); // false
var_dump(1 === true); // false
var_dump(0 === false); // false
// Notable exception: NAN — it never is equal to anything
var_dump(NAN == NAN); // false
var_dump(NAN === NAN); // false
강력한 비교를 사용하여 !==
사용하여 유형 및 값 이 일치 하지 않는지 확인할 수도 있습니다.
==
연산자가 충분하지 않은 일반적인 예는 검색 searchword
가 없으면 false
를 반환하는 strpos
와 달리 다른 유형을 반환 할 수있는 함수이고, 그렇지 않으면 match position ( int
)입니다.
if(strpos('text', 'searchword') == false)
// strpos returns false, so == comparison works as expected here, BUT:
if(strpos('text bla', 'text') == false)
// strpos returns 0 (found match at position 0) and 0==false is true.
// This is probably not what you expect!
if(strpos('text','text') === false)
// strpos returns 0, and 0===false is false, so this works as expected.
유형 주조
PHP는 일반적으로 사용하려는 컨텍스트에서 사용할 데이터 유형을 올바르게 추측하지만 수동으로 유형을 강제 설정하는 경우 유용합니다. 괄호 안에 필수 유형의 이름을 선언 앞에 붙여서 수행 할 수 있습니다.
$bool = true;
var_dump($bool); // bool(true)
$int = (int) true;
var_dump($int); // int(1)
$string = (string) true;
var_dump($string); // string(1) "1"
$string = (string) false;
var_dump($string); // string(0) ""
$float = (float) true;
var_dump($float); // float(1)
$array = ['x' => 'y'];
var_dump((object) $array); // object(stdClass)#1 (1) { ["x"]=> string(1) "y" }
$object = new stdClass();
$object->x = 'y';
var_dump((array) $object); // array(1) { ["x"]=> string(1) "y" }
$string = "asdf";
var_dump((unset)$string); // NULL
하지만 조심해야합니다 : 모든 타입 캐스트가 예상대로 작동하지는 않습니다.
// below 3 statements hold for 32-bits systems (PHP_INT_MAX=2147483647)
// an integer value bigger than PHP_INT_MAX is automatically converted to float:
var_dump( 999888777666 ); // float(999888777666)
// forcing to (int) gives overflow:
var_dump((int) 999888777666 ); // int(-838602302)
// but in a string it just returns PHP_INT_MAX
var_dump((int) "999888777666"); // int(2147483647)
var_dump((bool) []); // bool(false) (empty array)
var_dump((bool) [false]); // bool(true) (non-empty array)
자원
리소스 는 외부 리소스 (예 : 파일, 소켓, 스트림, 문서 또는 연결)를 참조하는 특수 유형의 변수입니다.
$file = fopen('/etc/passwd', 'r');
echo gettype($file);
# Out: resource
echo $file;
# Out: Resource id #2
다른 (하위) 유형의 자원이 있습니다. get_resource_type()
사용하여 자원 유형을 확인할 수 있습니다.
$file = fopen('/etc/passwd', 'r');
echo get_resource_type($file);
#Out: stream
$sock = fsockopen('www.google.com', 80);
echo get_resource_type($sock);
#Out: stream
여기 에 내장 된 리소스 유형의 전체 목록을 찾을 수 있습니다.
유형 저글링
PHP는 약형 언어입니다. 명시 적으로 데이터 유형을 선언 할 필요가 없습니다. 변수가 사용되는 컨텍스트에 따라 데이터 유형이 결정됩니다. 변환은 자동으로 수행됩니다.
$a = "2"; // string
$a = $a + 2; // integer (4)
$a = $a + 0.5; // float (4.5)
$a = 1 + "2 oranges"; // integer (3)