Pregunta

Hay alguna forma de emular la estructura de clase en PHP?es decir, una clase que se pasa por valor y no por referencia, por lo que todavía puede ser de tipo insinuó...

Y si es así, ¿qué técnicas se puede utilizar?¿Cuál es la mejor técnica?

Si esto es posible que obviamente podría crear una totalmente seguro del tipo de capa para PHP, existen dichas capas?Alguien ha tenido alguna experiencia con esto?

¿Fue útil?

Solución

Los objetos se pasan siempre por referencia.La única manera de hacer pasar como una copia es para utilizar explícitamente la clone palabra clave (sí, en todas partes).

Mi recomendación sería utilizar una matriz, que son tipos de valor y por lo tanto siempre se copian.Ya que se puede utilizar como un array asociativo (por ejemplo, de cadena -> valor), que bien podría ser un objeto.La desventaja es, por supuesto, usted no puede utilizar los métodos (pero eso es como un struct así que usted puede ser feliz con esto).No hay manera de aplicar el tipo de seguridad, sin embargo.

Pero con todos sus requisitos suena como PHP no es su tipo de lenguaje, para ser honesto.

Otros consejos

Creo que la forma más fácil es hacerlo como Java no -. Tener sus clases de valores inmutables, y dejar que todos los métodos de "modificación" devuelven un nuevo objeto en lugar

No creo que se puede lograr ese objetivo, solamente con el código PHP.

Usted no tiene control sobre cómo los parámetros identificador de función de PHP, y no veo cómo podría asegurarse de que todo se maneja de la manera deseada, sin tener que cambiar el (nivel inferior) de código en el binario y los módulos de PHP .

Sería muy bien, sin embargo:)

Yo estaba jugando con la sugerencia del anonimato para hacer cualquier mutación del objeto devuelven un objeto nuevo, y esto funciona, pero es difícil.

<?php
class FruityEnum {
    private $valid = array("apple", "banana", "cantaloupe");
    private $value;

    function __construct($val) {
        if (in_array($val, $this->valid)) {
            $this->value = $val;
        } else {
            throw new Exception("Invalid value");
        }
    }

    function __set($var, $val) {
        throw new Exception("Use set()!!");
    }
    function set(FruityEnum &$obj, $val) {
        $obj = new FruityEnum($val);
    }

    function __get($var) { //everything returns the value...
        return $this->value;
    }
    function __toString() {
        return $this->value;
    }
}

Y ahora para probarlo:

function mutate(FruityEnum $obj) { // type hinting!
    $obj->set($obj, 'banana');
    return $obj;
}

$x = new FruityEnum('apple');
echo $x; // "apple"
$y = mutate($x);
echo  $x // still "apple"
    . $y // "banana"

Se trabaja, pero usted tiene que utilizar una extraña manera de cambiar el objeto:

$obj->set($obj, 'foo');

El único que se me ocurrió hacerlo sería utilizar el método __set(), pero que era aún peor. Había que hacer esto, que es sangrienta confusión.

$obj = $obj->blah = 'foo';

Al final, es probable que sea más fácil hacer las variables privado y no proporcionan mutadores, por lo que la única manera de cambiar el valor "enumeración" de una variable sería la creación de una nueva:

echo $obj; // "banana"
$obj = new FruityEnum("cantaloupe");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top