Pergunta

Existe alguma maneira para emular uma classe estrutura em PHP? ou seja, uma classe que passa por valor e não por referência, por isso ainda pode ser do tipo sugerido ...

E se assim for, quais as técnicas diferentes poderiam ser usados? Qual é a melhor técnica?

Se isso é possível que você poderia, obviamente, criar uma camada seguro totalmente digite para PHP, existem tais camadas? Alguém já teve alguma experiência com isso?

Foi útil?

Solução

Os objetos são sempre passados ??por referência. A única maneira de fazê-los passar como uma cópia é explicitamente usar a palavra-chave clone (sim, em todos os lugares).

A minha recomendação seria usar uma matriz, que são tipos de valor e, portanto, sempre copiados. Desde que você pode usá-lo como uma matriz associativa (por exemplo string -> valor), ele poderia muito bem ser um objeto. A desvantagem é, é claro, você não pode usar métodos (mas isso é como uma estrutura para que você pode ser feliz com isso). Não há nenhuma maneira de impor a segurança de tipos, no entanto.

Mas, com todos os seus requisitos que soa como PHP não é o seu tipo de linguagem, para ser honesto.

Outras dicas

Eu acho que a maneira mais fácil é fazê-lo como Java faz -. Ter suas classes de valor ser imutável, e deixar todos os métodos "modificação" retornar um novo objeto em vez

Eu não acho que você pode alcançar esse objetivo, apenas com o código PHP.

Você não tem controle sobre como os parâmetros identificador de função PHP, e eu não vejo como você pode ter certeza que tudo é tratado da maneira que quiser, sem ter que mudar o código (de menor nível) no binário PHP e módulos .

Seria muito legal, embora:)

Eu estava brincando com a sugestão de anônimo para fazer quaisquer mutações do objeto retornar um novo objeto, e isso funciona, mas é estranho.

<?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;
    }
}

E agora para testá-lo:

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"

Ele funciona, mas você tem que usar uma estranha forma de mudar o objeto:

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

A única outra maneira que eu poderia pensar em fazer isso seria usar o método __set(), mas isso era ainda pior. Você tinha que fazer isso, que é sangrenta confuso.

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

No final, é provavelmente mais fácil de fazer as variáveis ??privado e não fornecem mutators, então a única maneira de alterar o valor "enumeração" de uma variável seria a criação de um novo:

echo $obj; // "banana"
$obj = new FruityEnum("cantaloupe");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top