수색…


통사론

  • $ 변수 = '값'; // 일반 변수 지정
  • $ 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() 은 각각 integerboolean 입니다. 그러나 이러한 변수에 대한 형식 힌트를 사용하려면 intbool 을 사용해야합니다. 그렇지 않으면 PHP는 구문 오류를주지 않지만 integerboolean 클래스 가 전달 될 것으로 예상 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 이 설정된 곳을 추측 할 필요가 없습니다. 더 좋은 방법은 타입 선언 을 사용하여 전달되는 것을 제한하는 것입니다.

그래서 우리는 $bobBar 클래스의 인스턴스이거나 Bar 의 자식 인스턴스입니다. 즉,이 클래스의 메서드를 사용할 수 있음을 의미합니다. 표준 오토로더 (PHP 5.3부터 사용 가능)와 결합하여 이제 Bar 가 정의 된 위치를 추적 할 수 있습니다. PHP 7.0 또는 이후 버전에는 확장 유형 선언이 포함되어 있으며 여기에는 int 또는 string 과 같은 스칼라 유형도 사용할 수 있습니다.

4.1

슈퍼 글로벌 변수

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
  • nullfalse 와 같습니다.
$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 == truetrue 입니다. 이것은 NAN0이 아닌 부동 소수점 값이기 때문입니다.
    • 0 값은 IEEE 754에 정의 된대로 +0과 -0을 모두 포함합니다. PHP는 배정 밀도 부동 소수점에서 +0과 -0을 구분하지 않습니다. 즉, floatval('0') == floatval('-0') true 입니다.
      • 사실, floatval('0') === floatval('-0') .
      • 또한 floatval('0') == falsefloatval('-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 값을 반환합니다.

모두 있기 때문에 0false 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
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow