PHP mimarisi ve pass-by-reference vs pass-by-value

4 Cevap php

PHP mimarları dan arayan önerileri!

PHP ile korkunç aşina değilim ama dilde yazılmış büyük bir analitik paketinin bakımı üzerine almış. Mimarisi, bu modüllerin her bilinen bu rapor parametreleri ayıklamak için çeşitli ayrıştırma modüller geçirilir büyük anahtar / değer diziler, içine bildirilen verileri okumak için tasarlanmıştır. Bilinen parametreler ana diziden kaldırılır ve modülleri tarafından tanınmadı herhangi kalanlar, "bilinmeyen" veri noktalarını gösteren catch-all bir tür raporunda dökülmektedir.

Orada bu ayrıştırıcı modülleri çağırmak için kullanılan birkaç farklı yöntem vardır, ve ben herhangi bir "doğru" PHP yapı olarak kabul edilir olmadığını hangi bilmek istiyorum. Bazı pass-by-reference kullanıyorsanız, diğerleri pass-by-value, bazı işlevler, bazı nesneler vardır. Bunların hepsi bir şekilde giriş parametresi değiştirin.

Bir süper basitleştirilmiş bir örnek şöyle:

#!/usr/bin/php
<?php

$values = Array("a"=>1, "b"=>2, "c"=>3, "d"=>4 );


class ParserA {
    private $a = null;
    public function __construct(&$myvalues) {
        $this->a = $myvalues["a"];
        unset($myvalues["a"]);
    }
    public function toString() { return $this->a; }
}

// pass-by-value
function parse_b($myvalues) {
    $b = $myvalues["b"];
    unset($myvalues["b"]);
    return Array($b, $myvalues);
}

// pass-by-reference
function parse_c(&$myvalues) {
    echo "c=".$myvalues["c"]."\n";
    unset($myvalues["c"]);
}

// Show beginning state
print_r($values);

// will echo "1" and remove "a" from $values
$a = new ParserA($values);
echo "a=".$a->toString()."\n";
print_r($values);

// w ill echo "2" and remove "b" from $values
list($b, $values) = parse_b($values);
echo "b=".$b."\n";
print_r($values);

// will echo "3" and remove "c" from $values
parse_c($values);
print_r($values);

?>

Çıkış olacaktır:

Array
(
    [a] => 1
    [b] => 2
    [c] => 3
    [d] => 4
)
a=1
Array
(
    [b] => 2
    [c] => 3
    [d] => 4
)
b=2
Array
(
    [c] => 3
    [d] => 4
)
c=3
Array
(
    [d] => 4
)

Ben çok farklı kullanarak arama işlevi parametreleri üzerine etkileri gizlediniz bazıları kullanımda çağrı yöntemleri, "& işaretçi" tarzı fonksiyonlar, onların çıktı yazmak için ana gövdeyi gerektiren bazı sahip ve bazı çıktılarını yazarken çok rahatsızım bağımsız.

Ben tek bir metodoloji seçin ve sopa ile tercih ederim. Bunu yapmak için, ben de en verimli olduğunu bilmek istiyorum; PHP belgelerine benim okuma bu kopya-on-write kullandığından beri, doğrudan nesneyi geçen vs işaretçileri kullanarak ve bir geri dönüş değeri yeniden-okuma arasında çok performans farkı var olması gerektiğini gösterir. Ben de nesne yönelimli yapısı kullanmayı tercih, ancak gizli değişiklikler yapıcısı üzerinde giriş parametresi için yapılıyor rahatsız değilim olacaktır.

Üç çağrı yöntemleri, ParserA (), parse_b (), ve parse_c (), hangi herhangi en uygun tarzı ise?

4 Cevap

Gerçekten PHP bir uzman değilim ama benim deneyim değeri geçen iyidir. Bu şekilde kod yan etkileri olmaz ve o map fonksiyonu için geri arama gibi kullanarak gibi üzerinde çılgınca şeyler, her türlü anlamak ve korumak ve yapmak daha kolay olacak demektir. Yani bir şeyler yapmanın parse_b yol için tüm kulüpler.

Bilginize: PHP, nesneleri her ne olursa olsun, referans olarak kabul edilir. Bunu nesneleri ve skaler değerler ile bir dizi varsa da, skalar değerler değer geçirilir, fakat referans nesneler.

As a general rule in PHP, do not use references unless you really have to. references in PHP are also not what most people expect them to be:

"PHP Kaynaklar farklı isimlerle aynı değişken içeriğe erişmek için bir araç vardır Bunlar C işaretçileri gibi değil,. Bunun yerine sembol tablosu rumuzudur." "

ayrıca bkz: php.net: What References Are

So in short:
The proper way of handling this PHP is using creating an object that passes the variables around by value or manipulating the array with array_map (array_map allows you to apply a callback function to the elements an array.)

Ben genel olarak önerilen yöntemlere karşı oy vereceğini, ancak bunların, ben parse_b iyi fikir olduğunu düşünüyorum.

Ben bunu kolayca bunun dışında bir tuşa "pop" izin verebilecek bir sınıf "veri" dizi sarmak daha iyi tasarım olacağını düşünüyorum. Yani ayrıştırıcı gibi bakıyor biter:

class ParserA {
  private $a = null;
  public function __construct(My_Data_Class $data) {
    $this->a = $data->popValue("a");
  }
  public function toString() { return $this->a; }
}

Ve bir örnek uygulama

class My_Data_Class {
  protected $_data;
  public function __construct(array $data) {
    $this->_data = $data;
  }
  public function popValue($key) {
    if (isset($this->_data[$key])) {
       $value = $this->_data[$key];
       unset($this->_data[$key]);
       return $value;
    }
  }
}