다음 StdClass
과 같은 것을 상상해보십시오 .
$foo = new stdClass();
$foo->bar = "baz";
$foo->baz = "1";
이제 어떻게 $foo->baz
int로 캐스트 할 수 있습니까? 다음을 수행 할 수 있습니다.
$foo->baz = (int) $foo->baz;
그러나 이것은 너무 긴 진술처럼 보입니다. 이 작업을 수행하는 더 짧은 방법이 있습니까?
표준 "작업 단축"은 사용자 기능에서 발생합니다. 짧게 :
function as_int(&$var) {
$var = (int) $var;
}
as_int($foo->baz);
이 함수를 사용하여 객체의 속성 만 참조로 전달합니다. 함수 내부의 개체에 액세스해야하는 경우에 유용한 약간 더 긴 형식은 다음과 같습니다.
function prop_as_int(object $obj, string $prop) {
$obj->$prop = (int) $obj->$prop;
}
prop_as_int($foo, 'baz');
두 기능 모두 다음과 같은 결과를 가져옵니다.
var_dump($foo);
/*
object(stdClass)#2 (2) {
["bar"]=> string(3) "baz"
["baz"]=> int(1)
}
*/
객체는 기본적으로 PHP에서 참조로 전달되기 때문에 여기 에는 return
문이나 참조 된 인수 ( &$obj
) 가 없습니다 . 예를 들어 값이 숫자 / 숫자인지, 속성이 존재하는지 (두 번째 예에서) 등의 온 전성 검사를 함수에 추가 할 수 있습니다.
대신 사용자 정의 클래스와 int 유형 속성을 사용할 수도 있습니다 stdClass
. 엄격한 유형 을 사용한다고 가정하고 유형 적합성을 처리하는 setter를 사용 합니다 . 엄격한 유형을 사용하지 않는 경우 추가 한 속성을 올바른 데이터 유형에 강제로 가져 오는 것은 정말 간단합니다.
class Foo {
public int $baz;
}
$foo = new Foo();
$foo->baz = "1";
var_dump($foo);
/*
object(Foo)#2 (1) {
["baz"]=> int(1)
}
*/
보시다시피 값은 선언 된 속성 유형으로 자동 변환되었습니다. 당신이 있다면 declare(strict_types = 1);
사용, 그것은 그러나 초래 TypeError: Typed property Foo::$baz must be int, string used
하고, 솔루션은 유형 확인 / 강요 세터가 될 것입니다. 그러나 효율적으로 구현하는 것은이 답변의 범위를 벗어납니다.
이 접근 방식의 단점은 함수 호출의 오버 헤드가 발생한다는 것입니다. 이는 수천 번 호출하지 않으면 중요하지 않습니다. 다른 상황에서 작업을 자주 반복하고 타이핑을 줄이려는 경우이 작업을 수행하는 것이 좋습니다. 그러나 많은 수의 개체를 반복하는 루프에서이 작업을 수행하는 경우 철자를 입력하십시오. 성능 향상은 문제의 가치가 있습니다.
마지막으로, 속성 이름을 예측할 수없고 계속 사용 stdClass
하고 싶지만 모든 숫자 / 정수로 구성된 모든 변수가 int 데이터 유형이어야한다는 것을 알고 있다면 객체가 데이터로 포화되면 다음을 사용하여 속성을 반복합니다. 수표 !is_int($prop) && ctype_digit($prop)
숫자로만 구성이 아닌 모든 INT의 속성과 일치, 그 캐스팅되며, 데이터 유형을 int로. 당신도 그것을 함수로 바꾸고 싶을 것입니다 : 그것은 숙제를위한 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다