PHP에서 잘못된 유형의 사용을 방지하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/137336

  •  02-07-2019
  •  | 
  •  

문제

우리 모두가 알고 있듯이 PHP는 매우 느슨하게 입력되었습니다. 언어는 함수 매개 변수 또는 클래스 변수에 대해 어떤 종류의 유형도 지정할 필요가 없습니다. 이것은 강력한 기능이 될 수 있습니다.

그러나 때로는 대본을 디버깅하는 것이 고통스러운 경험이 될 수 있습니다. 예를 들어, 한 종류의 객체를 다른 종류의 객체를 기대하는 메소드로 전달하면 통과 된 객체에 특정 변수/메소드가 존재하지 않는다고 불평하는 오류 메시지를 생성 할 수 있습니다. 이러한 상황은 대부분 성가심입니다. 더 끔찍한 문제는 잘못된 클래스의 객체로 하나의 객체를 초기화하고 스크립트의 실행에서 나중에 "잘못된 객체"를 사용하지 않을 때입니다. 이 경우 원래 인수를 통과했을 때보 다 훨씬 늦게 오류가 발생합니다.

내가 통과 한 내용은 특정 방법이나 변수가 없다고 불평하는 대신, 나중에 스크립트 실행을 훨씬 나중에 대기 할 때까지 대상으로 통과 할 때까지 기다리는 대신, 오히려 잘못된 유형의 객체를 지정하는 곳에 오히려 오류 메시지가 훨씬 큽니다.

코드에서 이러한 상황을 어떻게 처리합니까? 호환되지 않는 유형을 어떻게 감지합니까? 더 쉽게 이해되는 오류 메시지를 얻을 수 있도록 스크립트에 유형 확인을 어떻게 소개 할 수 있습니까?

또한 PHP의 상속을 설명하는 동안 어떻게이 모든 것을 할 수 있습니까? 고려하다:

<?php
class InterfaceClass
{
#...
}

class UsesInterfaceClass
{
   function SetObject(&$obj) 
   {
       // What do I put here to make sure that $obj either
       // is of type InterfaceObject or inherits from it       

   }
}
?>

그런 다음이 코드의 사용자는 자체 콘크리트 클래스와 인터페이스를 구현합니다.

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

ConcreteClass 인스턴스와 미래의 미지의 사용자 정의 객체도 SetObject에 허용되기를 원합니다. 올바른 유형을 확인할 때이 허용을 어떻게 만들 수 있습니까?

도움이 되었습니까?

해결책

실제로 클래스의 경우 PHP (5+)에서 유형 힌트를 제공 할 수 있습니다.

 <?php
 class UsesBaseClass
 {
      function SetObject(InterfaceObject $obj) 
      {
      }
 }
 ?>

이것은 또한 예상대로 상속과 함께 올바르게 작동합니다.

따로, '대상'이라는 단어를 클래스 이름에 넣지 마십시오 ...

다른 팁

Eran Galperin의 응답에 추가하여 유형 힌트를 사용하여 매개 변수를 특정 클래스의 객체뿐만 아니라 배열로 강제 할 수 있습니다.

<?php
class MyCoolClass {
   public function passMeAnArray(array $array = array()) {
      // do something with the array  
   }  
 }  
 ?>

보시다시피 힌트를 입력 할 수 있습니다. ::passMeAnArray() 메소드를 기대합니다 array 메소드를 w/o 모든 매개 변수라고하는 경우 기본값을 제공 할뿐만 아니라 기본값을 제공합니다.

원시 유형의 경우 IS_* 함수를 사용할 수도 있습니다.

public function Add($a, $b)
{
  if (!is_int($a) || !is_int($b))
    throw new InvalidArgumentException();
  return $a + $b;
}

알다시피, 여러 가지 답이 있습니다 힌트를 입력하십시오. 이것이 기술적 인 솔루션입니다. 그러나 전체 디자인이 합리적이고 직관적인지 확인해야합니다. 이렇게하면 유형의 문제와 실수가 더 드물게됩니다.

이러한 유형의 실패조차도 던져 질 것임을 기억하십시오 런타임에. 코드 테스트가 있는지 확인하십시오.

설명하는 경우에도 스크립트가 충돌하여 객체 y에 메소드 / 속성 X가 없다고 불평하므로 어디에서 왔는지 알 수 있습니다.

어쨌든, 나는 항상 자란 프로그래머가 잘못된 개체를 방법에 전달하는 것을 방지하려고 노력하는 것은 좋은 시간이 아닙니다. 대신 문서화와 훈련에 쓸 수 있습니다.

오리 타이핑과 신중한 동료는 필요한 것입니다. 추가 점검이 아니라 앱을 더욱 엄격하게 만들 수 있습니다.

그러나 그것은 Pythonista의 관점 일 수 있습니다 ...

@에란 갈 페린의 응답은 사용중인 객체가 올바른 유형인지 확인하기위한 선호되는 방법입니다.

또한 주목할만한 가치가 있습니다 대신에 연산자 - 객체가 여러 유형 중 하나인지 확인하고 싶을 때 도움이됩니다.

php.ini 파일에서 error_reporting ini 설정을 설정하거나 error_reporting function을 사용하여 실행 시간에 설정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top