programing

PHP에서 연산자 오버로드가 가능합니까?

css3 2023. 11. 1. 22:32

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++의 개념과 다릅니다.+, -, [] 등의 연산자에 과부하가 걸릴 수는 없다고 생각합니다.

가능한 해결책

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