Program Club

원시 값에 대한 PHP 유형 힌트?

proclub 2020. 10. 26. 21:31
반응형

원시 값에 대한 PHP 유형 힌트?


기본 유형을 기대하는 메소드를 유형 힌트 할 수 있는지 알고 싶습니다.

이 같은:

public function someMethod(string $str)
                         //^^^^^^

또는:

private function anotherMethod(int $num)
                             //^^^

동일한 방식으로 :

private function otherMethod(Person $rambo)
                           //^^^^^^

PHP에서 가능합니까?


PHP 7에서는 다음을 추가했습니다.

유형 선언을 통해 함수는 호출시 매개 변수가 특정 유형이어야합니다. 주어진 값이 잘못된 유형이면 오류가 생성됩니다. PHP 5에서는 복구 가능한 치명적인 오류가되고 PHP 7에서는 TypeError 예외가 발생합니다.

참조 : http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration


이 답변을 물었을 때 PHP 5가 최신 버전이며 다음과 같이 말했습니다.

PHP 5에는 유형 힌트가 도입되었습니다. 이제 함수는 매개 변수 를 객체 (함수 프로토 타입에 클래스 이름 지정), 인터페이스, 배열 (PHP 5.1 이후) 또는 호출 가능 (PHP 5.4 이후) 으로 강제 설정할 수 있습니다 . 그러나 NULL이 기본 매개 변수 값으로 사용되면 이후 호출에 대한 인수로 허용됩니다.

클래스 또는 인터페이스가 유형 힌트로 지정되면 모든 하위 또는 구현도 허용됩니다.

유형 힌트는 int 또는 string과 같은 스칼라 유형과 함께 사용할 수 없습니다. 자원과 특성도 허용되지 않습니다.

참조 : http://php.net/manual/en/language.oop5.typehinting.php


아니. PHP에는 기본 요소에 대한 자동 변환 기능이 있으므로 기본 요소에 대한 힌트를 입력 할 수 없습니다. http://bugs.php.net/bug.php?id=29508을 참조하십시오 . 이것은 PHP 팀이 갑작스런 마음의 변화를 일으키지 않는 한 결코 변하지 않을 것입니다 (의심 스럽지만 꽤 고집 스럽습니다).


예, 이제 가능합니다. 오랜 논의 끝에 스칼라 함수 매개 변수 및 반환 값에 대한 유형 힌트를 구현하는 제안이 지금까지 가장 많은 투표 수로 승인되었습니다. 자세한 내용을 확인하십시오.

스칼라 유형 힌팅은 함수 매개 변수의 유형과 int, float, string 및 bool 유형이 될 수있는 반환 값을 선언하는 것으로 구성됩니다.이를 통해 PHP 런타임 엔진은 매개 변수 함수에 전달 된 값 유형과 반환 값이 다음과 같은지 확인할 수 있습니다. 최종 프로그래밍 실수를 감지하기 위해 예상되는 유형. 객체, 배열 및 콜 러블에 대한 유형 힌트는 이전 PHP 버전에서 이미 허용되었습니다. 현재 구현에서는 5 개의 새로운 예약어 인 int, float, bool, string 및 numeric을 도입합니다. 캐스팅은 렉서에서 특별한 경우이기 때문에 이전에 예약되지 않았습니다.

Example :
function test(float $a) {
    var_dump($a); 
}

test(1); // float(1)
test("1"); // float(1)
test(1.0); // float(1)
test("1a"); // E_RECOVERABLE_ERROR
test("a"); // E_RECOVERABLE_ERROR
test(""); // E_RECOVERABLE_ERROR
test(1.5); // float(1.5)
test(array()); // E_RECOVERABLE_ERROR
test(new StdClass); // E_RECOVERABLE_ERROR

Scaler 유형 힌팅을 허용 할 수있는 소스 파일로 선언하는 옵션도 있습니다. 구성 스크립트의 첫 번째 줄이어야하며 동일한 파일의 다른 곳에서 선언 할 수 없습니다.

Like : declare(strict_types=1);

런타임에 PHP 엔진이 값을 반환하려고 할 때 선언 된 것과 일치하지 않는지 확인합니다. 치명적 오류 : increment ()에 전달 된 인수 1은 정수 유형이어야하며 주어진 문자열이어야합니다.

이 새로운 선언 기능을 사용하면 잘못된 유형의 값을 함수에 전달하여 발생하는 초기 프로그래밍 실수를 감지하여보다 강력한 애플리케이션을 작성할 수 있습니다.

유형의 자동 변경도 발생할 수 있습니다. 예를 들어, int 유형은 자동으로 float 유형 매개 변수로 변경 될 수 있습니다.

function test(float $x){
    var_dump($x);
}
test(10); // works fine

반환 유형 선언

함수 선언에서 마지막 괄호와 첫 번째 괄호 사이에 예상 유형이 뒤 따르는 콜론을 추가하여 반환 유형을 선언 할 수 있습니다.

값을 반환하지 않는 함수의 경우 반환 유형 선언 섹션에 아무것도 추가하지 않아야합니다.

function mustReturnInt(): int { ... }
function mustReturnString(): string { ... }
function mustReturnBool(): bool { ... }
function mustReturnFloat(): float { ... }
function doesNotReturnAnything() { ... }

조금 더 복잡한 예

declare(strict_types=1);  
class StrictTypesTestingClass {  
public function returnSameInt(int $value): int {   return $value;  }   
public function returnSameFloat(float $value): float {   return $value;  }  
public function returnSameString(string $value): string {   return $value;  }   
public function returnSameBool(bool $value): bool {   return $value;  } }  
$check = new StrictTypesTestingClass();  // calls that work  print $check->returnSameInt(10); 
print $check->returnSameFloat(10.0); 
print $check->returnSameString("test"); 
print $check->returnSameBool(true) ? 'true' : 'false';  // calls that throw exceptions 
print $check->returnSameInt("10"); 
print $check->returnSameFloat("10.0"); 
print $check->returnSameString(10);
print $check->returnSameBool("true");

Weak Type Checking 및 Type Conversion 동작 : weak type 검사 모드는 declare (strict_types = 0) 문과 함께 사용할 수 있습니다. 또는 엄격한 유형 선언이 없습니다. 고려해야 할 몇 가지 사항이 있습니다. 확장 또는 내장 PHP 함수에 대한 약한 유형 검사 호출은 이전 PHP 버전과 동일한 동작을합니다. 새로운 스칼라 유형 선언에 대한 약한 유형 검사 규칙은 대부분 확장 또는 내장 PHP 함수. NULL은 클래스, 콜 러블 및 배열에 대한 현재 유형 선언과 일치하기위한 특수한 경우입니다. NULL은 매개 변수가 아니고 명시 적으로 기본값 NULL이 지정되지 않는 한 기본적으로 허용되지 않습니다. 예를 들면 다음과 같습니다. function sample (int $ a = NULL);

이 접근 방식에는 많은 이점이 있습니다. 형식 안전성을 얻습니다. 즉, 마침내 코드를 정적으로 분석 할 수 있습니다! 한 함수에서 실수로 문자열을 다른 함수로 전달하는 버그를 감지 할 수 있습니다. 매일 PHP를 사용하고 Java를 OOP 언어에 대한 참조로 보는 개발자에게 이것은 PHP의 큰 발전입니다. .


모두가 이미 말했지만 PHP가 지원하지 않기 때문에 기본 형식에 대한 유형 힌트를 수행 할 수 없습니다. 그 이유는 자동 전환뿐만 아니라 커뮤니티 반응과도 관련이 있습니다.

지금까지 2010 년 5 월에 스칼라 유형 힌팅에 대한 지원이 PHP 트렁크에 추가되었음을 기억할 수 있습니다. 그러나 커뮤니티의 반응으로 인해이 기능은 5.4 릴리스에 포함되지 않았습니다.

이에 대해 약간의 논란이있었습니다. 변경에 반대하는 사람들은 이러한 지원이 PHP의 기본 설계에 위배 될 것이라고 주장했습니다. PHP는 약한 유형의 언어로 간주됩니다. 본질적으로 이것은 PHP가 데이터 유형을 선언 할 필요가 없음을 의미합니다. 변수에는 여전히 연관된 데이터 유형이 있지만 오류없이 정수에 문자열을 추가하는 것과 같은 근본적인 작업을 수행 할 수 있습니다.

IMHO : 스칼라 유형 힌팅은 PHP에 최대한 빨리 추가해야합니다. 우리 모두가 필요로하는 기능입니다. PHP가 약한 유형의 언어라는 점을 정말 존경하지만, 특히 OO 컨텍스트에서 고급 개발 및 프로덕션에서는 스칼라 유형 힌팅이 필수입니다. 절차 적 및 OO처럼 PHP에서 두 가지 대안을 모두 가질 수 있습니다.


예, 가능합니다.

http://ru2.php.net/manual/ru/language.oop5.typehinting.php#83442

경고 : 고해상도 : 원래 설명서에 오타가 RO UCE 대신 고해상도의 OU RCE가

사람들은 종종 스칼라 / 기본 타입 힌트에 대해 묻습니다. 다음은 사용자 지정 오류 처리기를 사용하여 유형 힌트를 활성화하는 MVC 프레임 워크에서 사용하는 클래스의 드롭입니다.

참고 : include 헤더의 다른 모든 코드 위에이 코드를 포함해야하며 set_error_handler () 함수를 사용하는 경우이 코드도 사용된다는 점을 알고 있어야합니다. set_error_handlers ()를 연결해야 할 수도 있습니다.

왜?

  1. 사람들은 매개 변수를 검증하기 위해 is_ * 함수를 사용하는 것에 지 쳤기 때문입니다.
  2. 방어 적 코더를위한 중복 코딩 감소.
  3. 함수 / 방법은 필요한 입력에 대해 자체 정의 / 문서화됩니다.

또한 .. PHP 내부 보드에서 PHP 6.0의 유형 힌트에 대한 토론을 따르십시오.

<?php

define('TYPEHINT_PCRE', '/^Argument (\d)+ passed to (?:(\w+)::)?(\w+)\(\) must be an instance of (\w+), (\w+) given/');

class Typehint
{

    private static $Typehints = array(
        'boolean'   => 'is_bool',
        'integer'   => 'is_int',
        'float'     => 'is_float',
        'string'    => 'is_string',
        'resource'  => 'is_resource'
    );

    private function __Constrct() {}

    public static function initializeHandler()
    {

        set_error_handler('Typehint::handleTypehint');

        return TRUE;
    }

    private static function getTypehintedArgument($ThBackTrace, $ThFunction, $ThArgIndex, &$ThArgValue)
    {

        foreach ($ThBackTrace as $ThTrace)
        {

            // Match the function; Note we could do more defensive error checking.
            if (isset($ThTrace['function']) && $ThTrace['function'] == $ThFunction)
            {

                $ThArgValue = $ThTrace['args'][$ThArgIndex - 1];

                return TRUE;
            }
        }

        return FALSE;
    }

    public static function handleTypehint($ErrLevel, $ErrMessage)
    {

        if ($ErrLevel == E_RECOVERABLE_ERROR)
        {

            if (preg_match(TYPEHINT_PCRE, $ErrMessage, $ErrMatches))
            {

                list($ErrMatch, $ThArgIndex, $ThClass, $ThFunction, $ThHint, $ThType) = $ErrMatches;

                if (isset(self::$Typehints[$ThHint]))
                {

                    $ThBacktrace = debug_backtrace();
                    $ThArgValue  = NULL;

                    if (self::getTypehintedArgument($ThBacktrace, $ThFunction, $ThArgIndex, $ThArgValue))
                    {

                        if (call_user_func(self::$Typehints[$ThHint], $ThArgValue))
                        {

                            return TRUE;
                        }
                    }
                }
            }
        }

        return FALSE;
    }
}

Typehint::initializeHandler();

?>

An are some examples of the class in use:

<?php

function teststring(string $string) { echo $string; }
function testinteger(integer $integer) { echo $integer; }
function testfloat(float $float) { echo $float; }

// This will work for class methods as well.

?>

당신은 그림을 ..


Accordind to PHP documentation type hinting is not supported for primitive types.

It's supported for classes and interfaces though.

Edit: I forgot to mention that's also supported for arrays.


Here is short syntax for forcing a boolean value out of a passed in parameter. If $state is true, then $this->is_active is set to true. For all other types of values it is set to false.

function set_active ( $state ) {
    $this->is_active = true === $state;
}

I guess you don't need type hinting for PHP because you're given type checking functions such as is_bool(), is_string() etc etc, so you could check whatever your trying to put into an argument against these functions before actually making it an argument, although the method they use to check array and object types would be much cleaner.

참고URL : https://stackoverflow.com/questions/5724677/php-type-hinting-to-primitive-values

반응형