Nasıl değiştirilmiş olan php bir dizinin parçası koruyabilirim?

3 Cevap php

Böyle php bir dizi var:

$ MyArray = array ('name' => 'juank', 'yaş' => 26, 'yapılandırma' => array ('türünüz' => 'admin', 'vb' => 'bla bla'));

Ben bu dizi "config" alanına DIŞINDA her alanda değişiklikleri sağlamak için komut boyunca erişilebilir olması gerekir. Nerede bir sınıf içinde özel bir ilan eğer olarak değiştirilmiş olan bir dizinin bir dizi veya bir kısmını korumak için bir yolu var mı? Ben bir sabiti olarak tanımlayan denedim ama komut yürütülürken değeri değişir bu. Bir sınıf olarak uygulanması sıfırdan komple uygulama yeniden oluşturmak olurdu anlamına gelir: S

teşekkürler!

3 Cevap

Sana "saf", "gerçek" dizileri kullanarak bunu yapabileceğimi sanmıyorum.

Bu might bazı sınıf kullanıyor ki uygular ArrayInterface almak için bir yolu; bu dizileri kullanarak gibi size kod olmazdı ... Ama aslında bazı verilere yazma erişimi yasaklamış olabilir erişimci yöntemleri ile, nesneleri kullanarak olurdu, sanırım ...

Bu change a couple of things (creating a class, instanciating it) Seni olurdu; but not everything: erişim hala bir dizi benzeri sözdizimi kullanarak olacaktır.


Something like this might do the trick (adapted from the manual) :

class obj implements arrayaccess {
    private $container = array();
    public function __construct() {
        $this->container = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }
    public function offsetSet($offset, $value) {
        if ($offset == 'one') {
            throw new Exception('not allowed : ' . $offset);
        }
        $this->container[$offset] = $value;
    }
    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}


$a = new obj();

$a['two'] = 'glop'; // OK
var_dump($a['two']); // string 'glop' (length=4)

$a['one'] = 'boum'; // Exception: not allowed : one

Sen hangi değil, new ile bir nesne instanciate var çok dizi gibi ... Ama, bundan sonra, bir dizi olarak kullanabilirsiniz.


And when trying to write to an "locked" property, you can throw an Exception, or something like that -- btw, declaring a new Exception class, like ForbiddenWriteException, would be better : would allow to catch those specifically :-)

Sen dizi özel yapmak ve birisi config tuşuna üzerine yazmak deneyin değil, kontrol edecek içeriğini değiştirmek için bir yöntem oluşturabilir.

<?php
    class MyClass {
        private static $myArray = array(
            'config' => array(...),
            'name' => ...,
            ...
        );

        public static function setMyArray($key, $value) {
            if ($key != 'config') {
                $this::myArray[$key] = $value;
            }
        }
    }

Eğer diziyi değiştirmek istediğinizde Sonra çağırır:

MyClass::setMyArray('foo', 'bar'); // this will work
MyClass::setMyArray('config', 'bar'); // this will be ignored

Hayır, ne yazık ki tarif ettiğin ne yapmak için bir yolu yoktur. Onlar bir nesnenin içinde kapsüllü sürece Değişkenler kamu veya özel herhangi bir kavram yok.

En iyi çözüm bir nesne biçime yapılandırmasını yeniden çalışmak ne yazık ki. Eğer sadece dizinin bu bölümü kullanıldığı yere göre, sizin kod birkaç yerde güncellemek zorunda izin verebilir özel ayarlarını içeren dizinin içindeki küçük bir nesne kullanmak mümkün olabilir.