es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Las referencias de PHP no funcionan en los macros de Laravel.

Intentando crear un método auxiliar para arrays que reemplaza la clave por un valor dado sin devolver nada utilizando una referencia, pero no funciona.

Arr::macro('replaceKey', function (string $from, string $into, array &$inside) {
    if (!array_key_exists($from, $inside)) {
        throw new Exception("Undefined offset: $from");
    }

    $inside[$into] = $inside[$from];
    unset($inside[$from]);
});

Intenté lo mismo con un trait y una función simple y funciona.

// dentro del trait

public function replaceKey(string $from, string $into, array &$inside)
{
    if (!array_key_exists($from, $inside)) {
        throw new Exception("Undefined offset: $from");
    }

    $inside[$into] = $inside[$from];
    unset($inside[$from]);
}

¿Alguien puede explicar por qué?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La diferencia entre usar un método auxiliar con una macro y usar un rasgo (trait) con una función simple es que las macros no se incluyen directamente en la clase u objeto, sino que se agregan dinámicamente usando el método macro. Esto significa que el método auxiliar con una macro no tiene acceso directo a las propiedades y métodos de la clase u objeto, incluida la matriz referenciada en este caso.

    Por otro lado, al usar un rasgo y una función simple, la función se incluye directamente en la clase u objeto y tiene acceso a sus propiedades y métodos, incluida la matriz referenciada. Es por eso que funciona la función simple mientras que la macro no.

    Para hacer que la macro funcione, sería necesario pasar la matriz referenciada como parámetro a la macro en lugar de intentar acceder a ella directamente. Algo como esto debería funcionar:

    Arr::macro('replaceKey', function (string $from, string $into, &$inside) {
        if (! array_key_exists($from, $inside)) {
            throw new Exception("Undefined offset: $from");
        }
    
        $inside[$into] = $inside[$from];
    
        unset($inside[$from]);
    });
    

    Aquí, el tercer argumento se pasa como una referencia a la matriz que necesita ser modificada, asegurando que cualquier cambio realizado dentro de la macro se refleje en la matriz original.

Comments are closed.