PHP에서 잘못된 유형의 사용을 방지하려면 어떻게해야합니까?
-
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을 사용하여 실행 시간에 설정할 수 있습니다.