splobjectStorage는 String에서 작동하지 않습니다. 어떻게해야합니까?

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

  •  19-09-2019
  •  | 
  •  

문제

누군가는 e에게 splobjectStorage를 사용하여 독특한 것들을 추적하도록 제안했습니다. 현으로 작동하지 않는 것을 제외하고는 훌륭합니다. 오류는 "splobjectStorage :: att

어떤 아이디어?

도움이 되었습니까?

해결책

그만큼 SplObjectStorage 이름이 말하는 것 : 개체를 저장하기위한 스토리지 클래스입니다. 다른 프로그래밍 언어와 달리 strings PHP의 대상이 아니며, 잘 끈입니다 ;-). 그러므로 문자열을 SplObjectStorage - 문자열을 클래스 대상으로 감싸더라도 stdClass.

고유 한 문자열 SI 모음을 저장하는 가장 좋은 방법은 문자열을 키로 사용하는 배열 (Hashtables)과 값 ( 이안 셀비).

$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...

그러나이 기능을 사용자 정의 클래스로 랩핑 할 수 있습니다.

class UniqueStringStorage // perhaps implement Iterator
{
    protected $_strings = array();

    public function add($string)
    {
        if (!array_key_exists($string, $this->_strings)) {
            $this->_strings[$string] = $string;
        } else {
            //.. handle error condition "adding same string twice", e.g. throw exception
        }
        return $this;
    }

    public function toArray()
    {
        return $this->_strings;
    }

    // ... 
}

그건 그렇고 당신은 SAN의 행동을 시뮬레이션합니다 SplObjectStorage PHP <5.3.0의 경우, 그것이 무엇을하는지 더 잘 이해합니다.

$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
    $id1 => $ob1,
    $id2 => $ob2
);

SplObjectStorage 각 인스턴스에 대해 고유 한 해시를 저장합니다 (예 : spl_object_hash()) 객체 인스턴스를 식별 할 수 있습니다. 위에서 말했듯이 : 문자열은 전혀 객체가 아니므로 인스턴스 해시가 없습니다. 문자열의 고유성은 문자열 값을 비교하여 점검 할 수 있습니다. 문자열 값을 비교할 수 있습니다. 두 줄은 동일한 바이트 세트를 포함 할 때 동일합니다.

다른 팁

그것은 물체 저장. 문자열은 a입니다 스칼라. 그래서 사용하십시오 splstring.

문자열을 stdclass로 감싸시겠습니까?

$dummy_object = new stdClass();
$dummy_object->string = $whatever_string_needs_to_be_tracked;
$splobjectstorage->attach($dummy_object);

그러나 문자열이 동일 하더라도이 방식으로 생성 된 모든 객체는 여전히 독특합니다.

중복 문자열에 대해 걱정 해야하는 경우 해시 (연관 배열)를 사용하여 대신 추적해야합니까?

$myStrings = array();
$myStrings[] = 'string1';
$myStrings[] = 'string2';
...

foreach ($myStrings as $string)
{
    // do stuff with your string here...
}

배열에서 문자열의 독창성을 보장하려면 몇 가지 작업을 수행 할 수 있습니다 ... 먼저 Array_unique ()를 사용하는 것입니다. 또는 값뿐만 아니라 열쇠로 문자열과 연관 배열을 만들 수 있습니다.

$myStrings = array();
$myStrings['string1'] = 'string1';
...

이것에 대해 객체 지향을 원한다면 다음과 같은 일을 할 수 있습니다.

class StringStore
{
   public static $strings = array();

   // helper functions, etc.  You could also make the above protected static and write public functions that add things to the array or whatever
}

그런 다음 코드에서 다음과 같은 작업을 수행 할 수 있습니다.

StringStore::$strings[] = 'string1';
...

그리고 같은 방식으로 반복하십시오.

foreach (StringStore::$strings as $string)
{
    // whatever
}

splobjectStorage는 객체의 고유 한 인스턴스를 추적하기위한 것이며, 문자열로 작업하지 않는 것은 외부에서 당신이 달성하려는 일에 약간의 과잉입니다 (내 의견으로는).

도움이되기를 바랍니다!

또는 __toString () 메소드가있는 객체로 문자열을 인스턴스화 할 수도 있습니다. 그렇게하면 객체와 문자열로 사용할 수있는 능력 (var_dump, echo) ..

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