수색…
통사론
- $ 변수 = '값'; // 일반 변수 지정
- $ object-> property = 'value'; // 객체 프로퍼티를 할당한다.
- ClassName :: $ 속성 = '값'; // 정적 클래스 속성 할당
- $ array [0] = 'value'; // 배열의 인덱스에 값을 할당한다.
- $ array [] = '값'; // 배열의 끝에있는 항목을 푸시합니다.
- $ array [ 'key'] = '값'; // 배열 값을 할당한다.
- echo $ variable; // 변수 값을 에코 (인쇄)합니다.
- some_function ($ 변수); // 변수를 함수 매개 변수로 사용
- unset ($ variable); // 변수 설정 해제
- $$ 변수 = '값'; // 변수 변수에 할당
- isset ($ 변수); // 변수가 설정되어 있는지 확인
- 빈 ($ 변수); // 변수가 비어 있는지 확인
비고
유형 검사
변수와 유형에 관한 일부 문서는 PHP가 정적 유형 지정을 사용하지 않는다고 설명합니다. 이것은 맞지만 PHP는 함수 / 메소드 매개 변수와 반환 값 (특히 PHP 7에서)에 관해서는 몇 가지 유형 검사를 수행합니다.
다음과 같이 PHP 7에서 타입 힌팅을 사용하여 매개 변수와 반환 값 타입 검사를 시행 할 수 있습니다 :
<?php
/**
* Juggle numbers and return true if juggling was
* a great success.
*/
function numberJuggling(int $a, int $b) : bool
{
$sum = $a + $b;
return $sum % 2 === 0;
}
참고 : 정수 및 부울에 대한 PHP의
gettype()
은 각각integer
및boolean
입니다. 그러나 이러한 변수에 대한 형식 힌트를 사용하려면int
및bool
을 사용해야합니다. 그렇지 않으면 PHP는 구문 오류를주지 않지만integer
및boolean
클래스 가 전달 될 것으로 예상integer
.
위의 예제는 숫자가 아닌 값이 $a
또는 $b
매개 변수로 제공되고 함수가 true
또는 false
이외의 값을 반환하는 경우 false
시킵니다. 당신이에 float 값 줄 수 같이 위의 예는, "느슨한"입니다 $a
또는 $b
. 엄격한 유형을 적용하려는 경우, 부동 소수점이 아닌 정수 만 입력 할 수 있으므로 PHP 파일의 맨 처음에 다음을 추가하십시오.
<?php
declare('strict_types=1');
PHP 7 이전에 함수와 메소드는 다음과 같은 타입에 대해 타입 힌팅을 허용했습니다 :
-
callable
(호출 가능한 함수 또는 메소드) -
array
(다른 배열도 포함 할 수있는 모든 유형의 배열) - 인터페이스 (정규화 된 클래스 이름 또는 FQDN)
- 클래스 (FQDN)
이름으로 변수를 동적으로 액세스하기 (변수 변수)
변수는 동적 변수 이름을 통해 액세스 할 수 있습니다. 변수의 이름은 다른 변수에 저장되어 동적으로 액세스 할 수 있습니다. 이러한 변수를 가변 변수라고합니다.
변수를 가변 변수로 바꾸려면 변수 앞에 추가 $
put을 넣습니다.
$variableName = 'foo';
$foo = 'bar';
// The following are all equivalent, and all output "bar":
echo $foo;
echo ${$variableName};
echo $$variableName;
//similarly,
$variableName = 'foo';
$$variableName = 'bar';
// The following statements will also output 'bar'
echo $foo;
echo $$variableName;
echo ${$variableName};
변수 변수는 함수 / 메소드 호출을 매핑하는 데 유용합니다.
function add($a, $b) {
return $a + $b;
}
$funcName = 'add';
echo $funcName(1, 2); // outputs 3
이것은 특히 PHP 클래스에서 유용합니다.
class myClass {
public function __construct() {
$functionName = 'doSomething';
$this->$functionName('Hello World');
}
private function doSomething($string) {
echo $string; // Outputs "Hello World"
}
}
가능하면 {}
사이에 $variableName
을 넣을 필요는 없습니다.
${$variableName} = $value;
다음 예제는 모두 동일하며 "baz"를 출력합니다.
$fooBar = 'baz';
$varPrefix = 'foo';
echo $fooBar; // Outputs "baz"
echo ${$varPrefix . 'Bar'}; // Also outputs "baz"
{}
사용은 변수 이름 자체가 표현식 일 때만 필수적입니다.
${$variableNamePart1 . $variableNamePart2} = $value;
그럼에도 불구하고 더 읽기 쉽기 때문에 항상 {}
사용하는 것이 좋습니다.
이렇게하지 않는 것이 좋지만이 동작을 연결할 수 있습니다.
$$$$$$$$DoNotTryThisAtHomeKids = $value;
가변 변수의 과도한 사용은 많은 개발자들에게 나쁜 관행으로 간주된다는 점에 유의해야합니다. 최신 IDE의 정적 분석에는 적합하지 않기 때문에 다양한 가변 변수 (또는 동적 메소드 호출)가있는 대규모 코드베이스를 신속하게 유지 보수하기 어려워 질 수 있습니다.
PHP5와 PHP7의 차이점
{}
또는 ()
을 항상 사용하는 또 다른 이유는 PHP5와 PHP7이 약간 다른 동적 변수 처리 방법을 사용하기 때문에 경우에 따라 결과가 달라지기 때문입니다.
PHP5에서는 PHP5의 특수한 경우와 달리 동적 변수, 속성 및 메서드가 왼쪽에서 오른쪽 순서로 엄격하게 평가됩니다. 아래 예는 평가 순서가 어떻게 변경되었는지를 보여줍니다.
사례 1 : $$foo['bar']['baz']
- PHP5 해석 :
${$foo['bar']['baz']}
- PHP7 해석 :
($$foo)['bar']['baz']
사례 2 : $foo->$bar['baz']
- PHP5 해석 :
$foo->{$bar['baz']}
- PHP7 해석 :
($foo->$bar)['baz']
사례 3 : $foo->$bar['baz']()
- PHP5 해석 :
$foo->{$bar['baz']}()
- PHP7 해석 :
($foo->$bar)['baz']()
사례 4 : Foo::$bar['baz']()
- PHP5 해석 :
Foo::{$bar['baz']}()
- PHP7 해석 :
(Foo::$bar)['baz']()
데이터 유형
다른 목적을 위해 다른 데이터 유형이 있습니다. PHP는 명시적인 타입 정의를 가지고 있지 않지만, 변수의 타입은 할당 된 값의 타입이나 그것이 형변환 된 타입에 의해 결정됩니다. 이것은 유형에 대한 간략한 개요입니다. 자세한 문서와 예제 는 PHP 유형 주제를 참조하십시오.
PHP에는 null, boolean, integer, float, string, object, resource 및 array와 같은 데이터 유형이 있습니다.
없는
널 (null)은 모든 변수에 지정할 수 있습니다. 값이없는 변수를 나타냅니다.
$foo = null;
이렇게하면 변수가 무효화되고 호출 될 경우 값이 정의되지 않거나 무효화됩니다. 변수는 메모리에서 지워지고 가비지 수집기에서 삭제됩니다.
부울
이것은 가능한 값이 두 가지 인 가장 간단한 유형입니다.
$foo = true;
$bar = false;
부울은 코드의 흐름을 제어하는 데 사용할 수 있습니다.
$foo = true;
if ($foo) {
echo "true";
} else {
echo "false";
}
정수
정수는 양수 또는 음수의 정수입니다. 어떤 번호로도 사용할 수 있습니다. 정수의 크기는 플랫폼에 따라 다릅니다. PHP는 부호없는 정수를 지원하지 않습니다.
$foo = -3; // negative
$foo = 0; // zero (can also be null or false (as boolean)
$foo = 123; // positive decimal
$bar = 0123; // octal = 83 decimal
$bar = 0xAB; // hexadecimal = 171 decimal
$bar = 0b1010; // binary = 10 decimal
var_dump(0123, 0xAB, 0b1010); // output: int(83) int(171) int(10)
흙손
부동 소수점 숫자, "복식"또는 간단히 "부동 소수점"은 십진수입니다.
$foo = 1.23;
$foo = 10.0;
$bar = -INF;
$bar = NAN;
정렬
배열은 값 목록과 같습니다. 가장 간단한 형식의 배열은 정수로 인덱싱되고 인덱스에 의해 정렬되며 첫 번째 요소는 인덱스 0에 놓입니다.
$foo = array(1, 2, 3); // An array of integers
$bar = ["A", true, 123 => 5]; // Short array syntax, PHP 5.4+
echo $bar[0]; // Returns "A"
echo $bar[1]; // Returns true
echo $bar[123]; // Returns 5
echo $bar[1234]; // Returns null
배열은 정수 인덱스 이외의 키를 값에 연결할 수도 있습니다. PHP에서 모든 배열은 배후의 연관 배열입니다. 그러나 '연관 배열'을 뚜렷하게 참조 할 때 일반적으로 정수가 아닌 하나 이상의 키를 포함하는 배열을 의미합니다.
$array = array();
$array["foo"] = "bar";
$array["baz"] = "quux";
$array[42] = "hello";
echo $array["foo"]; // Outputs "bar"
echo $array["bar"]; // Outputs "quux"
echo $array[42]; // Outputs "hello"
끈
문자열은 문자 배열과 같습니다.
$foo = "bar";
배열과 마찬가지로 문자열을 색인화하여 개별 문자를 반환 할 수 있습니다.
$foo = "bar";
echo $foo[0]; // Prints 'b', the first character of the string in $foo.
목적
객체는 클래스의 인스턴스입니다. 변수와 메소드는 ->
연산자로 액세스 할 수 있습니다.
$foo = new stdClass(); // create new object of class stdClass, which a predefined, empty class
$foo->bar = "baz";
echo $foo->bar; // Outputs "baz"
// Or we can cast an array to an object:
$quux = (object) ["foo" => "bar"];
echo $quux->foo; // This outputs "bar".
의지
리소스 변수는 열린 파일, 데이터베이스 연결, 스트림, 이미지 캔버스 영역 등과 같은 특수 핸들을 포함합니다 ( 설명서에 설명되어 있음).
$fp = fopen('file.ext', 'r'); // fopen() is the function to open a file on disk as a resource.
var_dump($fp); // output: resource(2) of type (stream)
변수의 유형을 문자열로 가져 오려면 gettype()
함수를 사용하십시오.
echo gettype(1); // outputs "integer"
echo gettype(true); // "boolean"
글로벌 변수 모범 사례
이 문제는 다음의 의사 코드로 설명 할 수 있습니다.
function foo() {
global $bob;
$bob->doSomething();
}
첫 번째 질문은 분명한 것입니다.
$bob
은 어디에서 왔습니까?
너 혼란 스럽니? 좋은. 당신은 왜 세계가 혼란스럽고 나쁜 습관을 생각 하는지를 배웠습니다.
이것이 진짜 프로그램이라면, 재미있는 부분은 $bob
의 모든 인스턴스를 추적하여 올바른 것을 찾을 수 있기를 바란다 ( $bob
이 어디에서나 사용된다면 악화된다). 더 나쁜 것은, 다른 사람이 가서 $bob
정의한 경우 (또는 그 변수를 잊어 버리고 재사용 한 경우) 코드가 손상 될 수 있습니다 (위의 코드 예에서는 잘못된 객체가 있거나 전혀 객체가 없으면 치명적인 오류가 발생할 수 있음).
거의 모든 PHP 프로그램은 include('file.php');
와 같은 코드를 사용하기 때문에 include('file.php');
이와 같이 코드를 유지 관리하면 더 많은 파일을 추가할수록 기하 급수적으로 어려워집니다.
또한 이로 인해 응용 프로그램을 테스트하는 작업이 매우 어려워집니다. 전역 변수를 사용하여 데이터베이스 연결을 유지한다고 가정 해보십시오.
$dbConnector = new DBConnector(...); function doSomething() { global $dbConnector; $dbConnector->execute("..."); }
이 함수를 단위 테스트하려면 전역 $dbConnector
변수를 무시하고 테스트를 실행 한 다음 원래의 값으로 재설정해야합니다.이 값은 버그가 자주 발생하기 쉽습니다.
/** * @test */ function testSomething() { global $dbConnector; $bkp = $dbConnector; // Make backup $dbConnector = Mock::create('DBConnector'); // Override assertTrue(foo()); $dbConnector = $bkp; // Restore }
지구본을 어떻게 피할 수 있습니까?
전역을 피하는 가장 좋은 방법은 Dependency Injection 이라는 철학입니다. 이것은 우리가 필요로하는 도구를 기능 또는 클래스에 전달하는 곳입니다.
function foo(\Bar $bob) {
$bob->doSomething();
}
이것은 이해하고 유지하는 것이 훨씬 쉽습니다. 호출자가 (우리가 알아야 할 것을 우리에게 알려주고 있다는 것을) 알기 때문에 $bob
이 설정된 곳을 추측 할 필요가 없습니다. 더 좋은 방법은 타입 선언 을 사용하여 전달되는 것을 제한하는 것입니다.
그래서 우리는 $bob
이 Bar
클래스의 인스턴스이거나 Bar
의 자식 인스턴스입니다. 즉,이 클래스의 메서드를 사용할 수 있음을 의미합니다. 표준 오토로더 (PHP 5.3부터 사용 가능)와 결합하여 이제 Bar
가 정의 된 위치를 추적 할 수 있습니다. PHP 7.0 또는 이후 버전에는 확장 유형 선언이 포함되어 있으며 여기에는 int
또는 string
과 같은 스칼라 유형도 사용할 수 있습니다.
슈퍼 글로벌 변수
PHP의 슈퍼 전역 변수는 미리 정의 된 변수이며 항상 사용할 수 있으며 스크립트 전체에서 모든 범위에서 액세스 할 수 있습니다.
global $ 변수를 수행 할 필요는 없습니다. 함수 / 메소드, 클래스 또는 파일 내에서 액세스 할 수 있습니다.
이 PHP 전역 전역 변수는 다음과 같습니다.
정의 된 모든 변수 가져 오기
get_defined_vars()
는 함수가 호출되는 범위에서 정의 된 변수의 모든 이름과 값을 가진 배열을 반환합니다. 데이터를 인쇄하려면 print_r
또는 var_dump
와 같이 사람이 읽을 수있는 데이터를 출력하는 표준 함수를 사용할 수 있습니다.
var_dump(get_defined_vars());
참고 :이 함수는 보통 $_GET
, $_POST
, $_COOKIE
, $_FILES
4 개의 슈퍼 전역 만 반환합니다. 다른 슈퍼 전역은 코드의 어딘가에서 사용 된 경우에만 리턴됩니다. 이는 기본적으로 활성화 된 auto_globals_jit
지정 문 때문입니다. 스크립트가 시작되면 $_SERVER
및 $_ENV
변수가 스크립트가 시작될 때가 아니라 처음 사용 (Just In Time) 될 때 만들어집니다. 이러한 변수가 스크립트 내에서 사용되지 않으면이 지정 문을 켜면 성능이 향상됩니다.
초기화되지 않은 변수의 기본값
그러나 PHP에서는 필요하지 않지만 변수를 초기화하는 것은 매우 좋습니다. 초기화되지 않은 변수는 사용 된 컨텍스트에 따라 유형의 기본값을가집니다.
설정 해제 및 참조 해제되지 않음
var_dump($unset_var); // outputs NULL
부울
echo($unset_bool ? "true\n" : "false\n"); // outputs 'false'
끈
$unset_str .= 'abc';
var_dump($unset_str); // outputs 'string(3) "abc"'
정수
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int); // outputs 'int(25)'
플로트 / 더블
$unset_float += 1.25;
var_dump($unset_float); // outputs 'float(1.25)'
정렬
$unset_arr[3] = "def";
var_dump($unset_arr); // outputs array(1) { [3]=> string(3) "def" }
목적
$unset_obj->foo = 'bar';
var_dump($unset_obj); // Outputs: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
초기화되지 않은 변수의 기본값에 의존하는 것은 한 파일을 동일한 변수 이름을 사용하는 다른 파일에 포함시키는 경우 문제가됩니다.
변수 값 진실성 및 동일 오퍼레이터
PHP에서 변수 값은 "진실"과 연관되어 있으므로 부울이 아닌 값이라도 true
또는 false
와 동일합니다. 이렇게하면 조건부 블록에서 모든 변수를 사용할 수 있습니다.
if ($var == true) { /* explicit version */ }
if ($var) { /* $var == true is implicit */ }
다음은 다양한 유형의 변수 값에 대한 몇 가지 기본 규칙입니다.
- 비제로 길이 문자열 동일시
true
그러한 whitepace로 함유 포함한 문자열' '
. - 빈 문자열
''
은false
과 동일합니다.
$var = '';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
$var = ' ';
$var_is_true = ($var == true); // true
$var_is_false = ($var == false); // false
- 정수 는 0이 아닌 경우
true
이고, 0 인 경우false
입니다.
$var = -1;
$var_is_true = ($var == true); // true
$var = 99;
$var_is_true = ($var == true); // true
$var = 0;
$var_is_true = ($var == true); // false
-
null
은false
와 같습니다.
$var = null;
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
- 빈 문자열
''
과 문자열 0'0'
은false
과 동일합니다.
$var = '';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
$var = '0';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
- 부동 소수점 값은 0이 아닌 값이
true
이고, 0이면false
입니다.-
NAN
(PHP의 Not-a-Number)은true
와 같습니다. 즉NAN == true
가true
입니다. 이것은NAN
이 0이 아닌 부동 소수점 값이기 때문입니다. - 0 값은 IEEE 754에 정의 된대로 +0과 -0을 모두 포함합니다. PHP는 배정 밀도 부동 소수점에서 +0과 -0을 구분하지 않습니다. 즉,
floatval('0') == floatval('-0')
true
입니다.- 사실,
floatval('0') === floatval('-0')
. - 또한
floatval('0') == false
및floatval('-0') == false
입니다.
- 사실,
-
$var = NAN;
$var_is_true = ($var == true); // true
$var_is_false = ($var == false); // false
$var = floatval('-0');
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
$var = floatval('0') == floatval('-0');
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
동일 운영자
에서 비교 연산자를위한 PHP 문서 , 동일한 운영자가 ===
. 이 연산자는 변수가 참조 값 과 동일한 지 확인하는 데 사용할 수 있습니다.
$var = null;
$var_is_null = $var === null; // true
$var_is_true = $var === true; // false
$var_is_false = $var === false; // false
해당 연산자가 동일하지 않습니다 !==
:
$var = null;
$var_is_null = $var !== null; // false
$var_is_true = $var !== true; // true
$var_is_false = $var !== false; // true
동일한 연산자는 is_null()
과 같은 언어 함수 대신 사용할 수 있습니다.
strpos()
사용하여 사례 사용
strpos($haystack, $needle)
언어 함수는 $haystack
에서 $haystack
$needle
발생하는 인덱스를 찾거나 인덱스가 발생하는지 여부를 찾는 데 사용됩니다. strpos()
함수는 대소 문자를 구별합니다. 대소 문자 구별 찾기가 필요한 경우 stripos($haystack, $needle)
와 함께 갈 수 있습니다.
strpos
& stripos
함수에는 세 번째 매개 변수 offset
(int)도 포함됩니다.이 매개 변수는 지정된 경우 문자열 시작 부분부터 계산 된이 문자 수를 검색합니다. strrpos 및 strripos와 달리 오프셋은 음수 일 수 없습니다.
이 함수는 다음을 반환 할 수 있습니다.
-
$haystack
의 시작 부분에$needle
이 있으면0
. -
$haystack
에서$haystack
$needle
이 시작 부분이 아닌 다른 곳에서 발견되면 인덱스를 지정하는 0이 아닌 정수. -
$haystack
에서$haystack
$needle
이 발견 되지 않으면false
값을 반환합니다.
모두 있기 때문에 0
과 false
truthiness이 false
PHP뿐만 대해서는 다른 상황을 나타냅니다 strpos()
, 그들 사이를 구별하고, 동일한 연산자를 사용하는 것이 중요합니다 ===
에 대해 정확하게보고 false
총점뿐 아니라 값 false
.
$idx = substr($haystack, $needle);
if ($idx === false)
{
// logic for when $needle not found in $haystack
}
else
{
// logic for when $needle found in $haystack
}
또는 동일한 연산자가 아닌 연산자 사용 :
$idx = substr($haystack, $needle);
if ($idx !== false)
{
// logic for when $needle found in $haystack
}
else
{
// logic for when $needle not found in $haystack
}