2012-02-17 7 views
7

Gdy "przyszłościowy" kod testując go w PHP 5.4, otrzymuję ostrzeżenie, którego nie rozumiem.W jaki sposób indeks mojej tablicy jest "Nielegalnym przesunięciem łańcucha"?

function __clone() { 
    $this->changed = TRUE; 
    foreach ($this->conditions as $key => $condition) { 
    if (
    $condition['field'] 
    instanceOf QueryConditionInterface) { 
     $this->conditions[$key]['field'] = clone($condition['field']); 
    } 
    } 
} 

wybuchła $condition['field'] w swoim wierszu, aby zmniejszyć ilość kodu, aby skupić. O tej konkretnej linii, PHP ma do powiedzenia

Warning: Illegal ciąg przesunięcie 'field' w DatabaseCondition->__clone()

A ja po prostu nie mogę zobaczyć, jak 'pole', jest nielegalne ciąg offset. Zgaduję, że brakuje mi czegoś oczywistego, ale jeśli społeczność nie może znaleźć problemu, zagram raport o błędzie.

Interpretuję ostrzeżenie jako "Pod żadnym pozorem" pole "nie jest prawidłowym kluczem". Ten błąd miałby sens, gdybym próbował do nas na przykład tablica jako klucz.

+0

Przegląd kodu służy do poprawienia działającego kodu. Konkretne pytania na temat znaczenia ostrzeżeń są tam nie na temat. –

+1

Czy możesz 'var_dump (" $ this-> conditions ");'? –

+0

Ten błąd występuje również podczas instalowania Drupala w PHP 5.4 http://drupal.org/node/1483986 Wierzę, że coś w PHP 5.4 jest zepsute, a może "pole" jest teraz zarezerwowanym słowem kluczowym PHP, którego nie można użyć do tablic, ale Skłaniam się do błędu PHP. Podano, że ten błąd nie występuje w poprzednich wersjach PHP. – Brain2000

Odpowiedz

2

Ostrzeżenie wygląda tak, jakby było napisane, że $condition jest ciągiem znaków. Bez żadnej znajomości kodu nie wiem, czy to ma jakiś sens.

+0

Bah, masz rację. Zgodnie z sugestią "Mike Purcell" powyżej, I var_dump $ warunki, gdy wystąpi błąd, i wydaje się, że czasami staje się ciąg. – Letharion

3

Bez większej wiedzy na temat tworzenia tablicy array/iterator, mogę tylko założyć, że najpierw należy sprawdzić, czy istnieje offset.

if(isset($condition['field']) && $condition['field'] instanceOf QueryConditionInterface) 

Korzystanie isset w tej sytuacji wystarczy i szybciej niż array_key_exists, jedyną różnicą jest to, jeśli $ warunek [ „pole”] jest NULL isset powrócą spadki, array_key_exists zwróci true, powoduje, że klucz nie istnieje. Ale ponieważ chcesz pracować tylko na polach, które są instancją QueryConditionInterface, będziesz działał dobrze z isset.

+0

To prawdopodobnie mnie powolny, ale nie widzę, jak to ma zastosowanie? Gdyby to było zawiadomienie o "polu", które nie istniało, nie miałbym problemu z cofnięciem problemu i znalezieniem źródła problemu. Ale teraz sposób, w jaki czytam błąd, pod żadnym pozorem nie jest "polem" ważnym kluczem; to nie ma dla mnie sensu. Dodałem to również do pytania. – Letharion

+0

jeśli $ warunek nie jest implementacją tablicową lub tablicową, to próbujesz uzyskać dostęp do łańcucha znaków i nie możesz uzyskać dostępu do tablicy ciągów znaków za pomocą ciągu znaków jako klucza i uzyskać nieprawidłowy błąd przesunięcia łańcucha, to dla mnie nowość, aby zobaczyć ten błąd na 5.4 głównie widzę to na gałęzi 6.0 ... –

+0

Wartość $ condition może być na przykład "ORAZ". – olleolleolle

Powiązane problemy