SplObjectStorage не работает со Строкой, что сделать?

По словам Michael Feathers, автора превосходного Работа Эффективно с Унаследованным кодом , унаследованный код является кодом, который не имеет никаких тестов. Когда нет никакого способа знать то, что повреждается, когда этот код изменяется.

главным, которое отличает унаследованный код от неунаследованного кода, являются тесты или скорее отсутствие тестов. Мы можем получить смысл этого с небольшим мысленным экспериментом: как легкий это должно было бы изменить Вашу кодовую базу, если это могло бы воздержаться, если это могло бы сказать Вам, когда Вы сделали ошибку? Это было бы довольно легко, не так ли? Большая часть страха, вовлеченного во внесение изменений в большие кодовые базы, является страхом перед представлением тонких ошибок; страх перед изменяющимися вещами непреднамеренно. С тестами можно сделать вещи лучше безнаказанно. Мне различие так очень важно, оно сокрушает любое другое различие. С тестами можно сделать вещи лучше. Без них Вы просто don’t знаете, является ли вещами улучшение или хуже.

7
задан sepehr 1 October 2009 в 08:24
поделиться

4 ответа

SplObjectStorage - это то, что его название говорит: класс хранилища для хранения объектов. В отличие от некоторых других языков программирования строки не являются объектами в PHP, они являются строками ;-). Поэтому нет смысла хранить строки в SplObjectStorage - даже если вы заключите свои строки в объект класса stdClass . уметь идентифицировать экземпляры объектов. Как я сказал выше: строка вообще не является объектом, поэтому у нее нет хэша экземпляра. Уникальность строки можно проверить путем сравнения строковых значений - две строки равны, если они содержат одинаковый набор байтов.

8
ответ дан 6 December 2019 в 15:24
поделиться
$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 предназначен для отслеживания уникальных экземпляров объектов, и помимо того, что не работает со строками, это немного излишне для того, что вы пытаетесь выполнить (на мой взгляд) .

Надеюсь, это поможет!

0
ответ дан 6 December 2019 в 15:24
поделиться

Обернуть строку в stdClass?

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

Однако каждый объект, созданный таким образом, все равно будет уникальным, даже если строки идентичны.

Если вам нужно беспокоиться о повторяющихся строках, возможно, вам следует использовать хэш (ассоциативный массив) для их отслеживания?

1
ответ дан 6 December 2019 в 15:24
поделиться

Это Объект Хранение. Строка - это скаляр. Поэтому используйте SplString.

.
5
ответ дан 6 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: