2011-01-12 22 views
11

yeni dönüş değeri atamak PHP 5.3 deprecated olmuştur. Bu şekilde, hatası E_DEPRECATED hatası veriyor. 5.3 eski kod bir sürü büyük bir uygulama yükseltirkenPHP 5.3 ve referans ile yeni dönüş değeri atama referans

, bu istenmeyen duyuruların bir sürü yol açar.

Bu sorunun olası bir çözümü olarak, =& new'un numaralı tüm örneklerini bulmak ve değiştirmek için normal bir ifade kullanmayı düşünüyorum. Örneğin, aşağıdaki tüm PHP dosyaları bulmak ve =& new tüm örneklerini silecek:

find ./ -name '*.php' | xargs perl -p -i -e 's/=(\s*)&(\s*)?new\b/= new/g' 

aşağıdaki soruların yanıtlarını Aranan:

  1. gayet çalışacak mı? Hangi olası sorunlara girebilirim?
  2. Değilse, =& new'un = new ile değiştirildiği kod örnekleri, PHP 5.3'teki davranışı değiştirecektir.
  3. Bu popüler kitaplıkların herhangi bir örneğinin bir soruna neden olduğu bilinir.
  4. =& new muazzam miktarlarda sabitlemeyle uğraşmak için başka hangi fikirleri önerirsiniz?

Bunun iyi çalıştığından şüpheliyim, ancak sorun yaşadığım kenar durumlarını arıyoruz. Evet, hata raporlama ayarlarını değiştirebileceğimi biliyorum. Ama uyarıları saklamak istemiyorum, onları düzeltmek istiyorum.

+0

E_DEPRECATED, hataların değil, bildirimler sınıfına aittir. Bunu düzeltmek için acele etmeniz gerekmediğinden emin değilim (magic_quotes, php 4.2'de onaylanmamış olarak bildirilmişti). Regex'e gelince: 'new''den sonra' \ b 'eklemelisiniz, ancak aksi takdirde uygulanabilir bir yeniden yazma yaklaşımı var. Ancak, yalnızca beklenen işlem mantığını (eğer olası değil) bozduğunu test edebilirsiniz. – mario

+0

@mario E_DEPRECATED sadece bir hata * seviyesi *. Her iki şekilde de başvurmak uygun olur. Bununla birlikte \ b ile iyi bir nokta. – mfonda

cevap

14

Duygularınız doğru. Genel olarak iyi çalışır, ancak olmadığı durumlarda kenarlıklar vardır. =& kullanma

= bu farklılıkları vardır:

  • =& sağ taraf bir başvuru verim yapmaya çalışacaktır; =, sağ taraf referansa geri dönen bir işlev gibi, bir referans verebilsin bile.
  • =& set eski referansı kırmak ve = sağ tarafına değerine sol tarafı olarak belirlenen aynı referans alarak tüm unsurların değerini değiştirmek olurken, yeni bir tane sol ve sağ tarafını hem koyacağız .

Bu durumda, ilk farkın yarısı ve ikinci yarısı alakasız. Ödevden sonra, yeni nesnenin * değeriyle tek bir değişken olacaktır ve tek elemanlı referans kümeleri anlamsızdır. Ancak =& sonları önceki referans ayarlanmış olması önemlidir:

<?php 

$g = 4; 
$v =& $g; 
$v = new stdclass(); 
var_dump($g); // object(stdClass)#1 (0) { } 

$g = 4; 
$v =& $g; 
$v =& new stdclass(); 
var_dump($g); // int(4) 

* belki yapıcı bir başvuru sızdırıyor, ancak sızıntı bile, yapıcısının içindeki $this o işaret bile, farklı bir değişken olabilir sürece aynı nesneye Bu yüzden bunun nedeni davranış farklılığını gözlemleyebileceğinden şüpheliyim.

+4

+1. Ancak yazım hatası, = & 'değil' & = 'olmalıdır. – Jonah

+0

@Jonah Sabit, teşekkürler! – Artefacto

+0

Vay, harika şeyler. Asla bir fark yarattığını düşünmezdim. +1 – NikiC

3

Evet, =& new'u = new ile değiştirebilmeniz gerekir. Nesneler PHP 5.3'te varsayılan olarak referans ile geçirilir, böylece hiçbir davranış değişmez. Gizlemek yerine uyarıları düzeltmek için

.

+0

+1 (Zorunlu "başvurular referans değerden geçirilen nesneler değil" değerine göre aktarılır.) – BoltClock

+0

+1 Hızlı öğreniyorum. – Ish

+0

-1 Yanlış ve alakasız. Bunlar birbirinin yerine geçemez ve hiç kimsenin bir şeyi (yapıcı argümanları hariç) referans veya değer olarak geçirmemesi ... – Artefacto

2

Herhangi bir sorun olmamalıdır. En kötü durumda bu, PHP 4'teki uygulamanızı biraz yavaşlatacak, ancak kesinlikle işlevselliği değiştirmeyecek.

Teorik olarak karşılaşabileceğiniz tek sorun, birisinin bir dizeye =& new yazmasıdır. Biliyorum, bu son derece olanaksızdır, ancak sadece '=' T_WHITESPACE? '&' T_WHITESPACE? T_NEW'un tüm oluşumlarını değiştirmek istiyorsanız, Tokenizer'u kullanarak bunu yapmalısınız.

+0

Elbette, ama belki de bu iyi bir şey olabilir. Birisi bir yorumda bir kodun "örnek kullanımını" kullanıyorsa, normal ifade örnek kullanımını düzeltir. Ama sanırım ne yapmamasının bir örneği olsaydı kötü olurdu :-) – mfonda

+0

Onlar aynı şey değiller. Yine de bir dizede görünen = & new' ile iyi bir nokta. Eski referansların kırıldığını göstermek için – Artefacto