Domanda

Ho un array in php come questo:

$ myArray = array ('name' = > 'juank', 'age' = > 26, 'config' = > array ('usertype' = > 'admin', 'etc' = > "bla bla"));

Ho bisogno che questo array sia accessibile lungo lo script per consentire le modifiche in qualsiasi campo TRANNE la "configurazione" " campo. Esiste un modo per proteggere un array o parte di un array dalla modifica come se fosse dichiarato privato all'interno di una classe? Ho provato a definirlo come costante ma il suo valore cambia durante l'esecuzione dello script. L'implementazione come classe significherebbe che dovrei ricostruire da zero l'applicazione completa: S

grazie!

È stato utile?

Soluzione

Non credo che tu possa farlo usando " puro " & Quot; reale " array.

Un modo per arrivare a questo potrebbe usare una classe che implementa ArrayInterface ; il tuo codice sembrerebbe che stia usando array ... Ma in realtà userebbe oggetti, con metodi di accesso che potrebbero vietare l'accesso in scrittura ad alcuni dati, immagino ...

Vorrebbe cambiare un paio di cose (creare una classe, istanziarla) ; ma non tutto : l'accesso continuerebbe a utilizzare una sintassi simile a un array.


Qualcosa del genere potrebbe fare il trucco (adattato dal manuale) :

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

Devi instanciare un oggetto con nuovo , che non è molto simile a un array ... Ma dopo puoi usarlo come un array.


E quando provi a scrivere su un "bloccato" proprietà, puoi generare un'eccezione o qualcosa del genere - tra l'altro, dichiarando una nuova classe Exception , come ForbiddenWriteException , sarebbe meglio: consentirebbe di catturare quelli specificamente < strong>: -)

Altri suggerimenti

Potresti rendere l'array privato e creare un metodo per modificarne il contenuto che controllerà se qualcuno non tenta di sovrascrivere la chiave config .

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

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

Quindi quando vuoi modificare l'array che chiami:

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

No, sfortunatamente non c'è modo di fare ciò che stai descrivendo. Le variabili non hanno alcun concetto di pubblico o privato a meno che non siano incapsulate all'interno di un oggetto.

Sfortunatamente la soluzione migliore è rielaborare la configurazione in un formato oggetto. Potresti essere in grado di utilizzare un piccolo oggetto all'interno dell'array che contiene le impostazioni private, il che potrebbe consentire di aggiornare solo alcune posizioni nel codice, a seconda di dove viene utilizzata quella parte dell'array.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top