[PHP] Modification d'une propriété privée de classe à l'exécution

Publié le 03/12/2019 • Mis à jour le 03/12/2019

English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧

Dans ce bout de code, nous allons voir comment modifier une propriété privée d'un objet PHP. J'ai récemment eu un cas d'utilisation concret quand j'ai du créer ma configuration pour le bundle EasyDeploy. J'ai eu à modifier une propriété privée de l'objet DefaultConfiguration pour que le déploiement puisse fonctionner.


<?php declare(strict_types=1);

// src/Controller/Snippet/Snippet61Trait.php

namespace App\Controller\Snippet;

use Symfony\Component\HttpFoundation\Request;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet61Trait
{
    public function snippet61(Request $request): void
    {
        $class = \get_class($request);
        echo sprintf('> Request value object class: %s'.PHP_EOL, $class);

        // This line would provoke a PHP error as the "isHostValid" is private
        // echo $request->isHostValid;

        $property = (new \ReflectionClass($request))->getProperty('isHostValid');
        $property->setAccessible(true); // now we can read and write "isHostValid"
        echo '> isHostValid: '.$property->getValue($request).PHP_EOL;

        $property->setValue($request, false);
        echo '> isHostValid: '.$property->getValue($request);

        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc