PHP에서 연산자 오버로드가 가능합니까?
구체적으로 Array 클래스를 생성하고 [] 연산자를 오버로드하고 싶습니다.
PHP5를 사용하는 경우(사용해야 할 경우), SPL ArrayObject 클래스를 살펴봅니다.설명서가 별로 좋지는 않지만 ArrayObject를 확장하면 "가짜" 배열을 갖게 될 것 같습니다.
편집: 간단한 예를 들어보겠습니다. 하지만 중요한 활용 사례는 없습니다.
class a extends ArrayObject {
public function offsetSet($i, $v) {
echo 'appending ' . $v;
parent::offsetSet($i, $v);
}
}
$a = new a;
$a[] = 1;
실제로 최적의 솔루션은 ArrayAccess 인터페이스의 네 가지 방법인 http://php.net/manual/en/class.arrayaccess.php 을 구현하는 것입니다.
개체를 'foreach' 컨텍스트에서도 사용하려면 'Iterator' 인터페이스를 구현해야 합니다. http://www.php.net/manual/en/class.iterator.php
PHP의 오버로딩 및 연산자(오버로딩 및 배열 연산자 참조) 개념은 C++의 개념과 다릅니다.+, -, [] 등의 연산자에 과부하가 걸릴 수는 없다고 생각합니다.
가능한 해결책
- SPL Array Object 구현(Cbeer에서 언급한 대로)
- 반복기 구현(인 경우)
ArrayObject
당신에게 너무 느립니다. - PECL 연산자 확장을 사용합니다(Benson이 언급한 대로).
PHP 5.0+에서 간단하고 깨끗한 솔루션을 위해 인터페이스와 override functions offsetGet, offset, offset을 구현해야 합니다.존재 및 offsetUnset입니다.이제 객체를 배열처럼 사용할 수 있습니다.
예(PHP7+의 경우):
<?php
class A implements ArrayAccess {
private $data = [];
public function offsetGet($offset) {
return $this->data[$offset] ?? null;
}
public function offsetSet($offset, $value) {
if ($offset === null) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->data[$offset]);
}
public function offsetUnset($offset) {
unset($this->data[$offset]);
}
}
$obj = new A();
$obj[] = 'a';
$obj['k'] = 'b';
echo $obj[0], $obj['k']; // print "ab"
언어의 기능이 아닌 것 같습니다. 이 버그를 참조하십시오.하지만 오버로드를 할 수 있는 패키지가 있는 것 같습니다.
간단히 말해서, 아니요. C++ 스타일의 과부하가 필요하다고 생각되는 경우 문제 해결책을 다시 생각해 볼 필요가 있습니다.아니면 PHP를 사용하지 않는 것도 고려해 볼 수 있습니다.
Jamie Zawinski의 말을 빌리자면, "당신은 문제가 있고 '나는 알고 있습니다!'라고 생각합니다.오퍼레이터 과부하를 걸겠습니다!'이제 두 가지 문제가 생겼습니다."
언급URL : https://stackoverflow.com/questions/787692/is-it-possible-to-overload-operators-in-php
'programing' 카테고리의 다른 글
자바스크립트 HTML5 캔버스를 이용하여 N개의 포인트를 통해 매끄러운 곡선을 그리는 방법? (0) | 2023.11.01 |
---|---|
mysql (mariadb) 튜닝 및 성능 테스터 (0) | 2023.11.01 |
부모에서 자식으로 각진 상태로 이벤트 전달JS 구성요소 (0) | 2023.11.01 |
How do I Start a job of a function i just defined? (0) | 2023.11.01 |
앱 설치 실패:장치에 쓸 수 없습니다. (0) | 2023.11.01 |