La mejor manera de acceder a la propiedad Class dentro de un método estático con PHP

3 minutos de lectura

Aquí está mi propiedad de clase

private $my_paths = array(
        'imagemagick' => 'E:\Server\_ImageOptimize\ImageMagick',
        'pngcrush' => 'E:\Server\_ImageOptimize\pngCrush\pngcrush.exe',
        'jpegtran' => 'E:\Server\_ImageOptimize\jpegtran\jpegtran.exe',
        'gifsicle' => 'E:\Server\_ImageOptimize\gifsicle\gifsicle.exe',
        'pngquant' => 'E:\Server\_ImageOptimize\pngquant\pngquant.exe',
        'pngout' => 'E:\Server\_ImageOptimize\pngout\pngout.exe'
);

Hay un método estático en la misma clase…

public static function is_image($file_path)
{

    $imagemagick = $this->my_paths['imagemagick']. '\identify';

    echo $imagemagick;
}

Por supuesto, esto me da errores como

Fatal error: Using $this when not in object context...

Luego intenté acceder a la propiedad de esta manera. self::my_paths['imagemagick'] pero eso no ayudó.

¿Cómo debería manejar esto?

  • Hágalos estáticos y self trabajará

    – matiño

    9 de enero de 2012 a las 8:35


Avatar de usuario de Jens
Jens

necesitas el $ firme delante del nombre de la variable/propiedad, por lo que se convierte en:

self::$my_paths['imagemagick']

Y my_paths no se declara como estático. Así que necesitas que sea

private static $my_paths = array(...);

Cuando no tiene la static palabra clave delante de él, espera ser instanciado en un objeto.

  • Ese era mi problema, perder el $ cuando probaría una propiedad estática gracias

    – Jason Davis

    9 de enero de 2012 a las 8:41

no puede acceder a propiedades no estáticas en métodos estáticos, debe crear una instancia del objeto en el método o declarar la propiedad como estática.

  • esta es la respuesta correcta ya que la respuesta seleccionada arrojará PHP Fatal Error : Access to undeclared static property

    –Muhammad Omer Aslam

    10 de julio de 2018 a las 12:24


convertirlo en propiedad estática

   private static $my_paths = array(
    'imagemagick' => 'E:\Server\_ImageOptimize\ImageMagick',
    'pngcrush' => 'E:\Server\_ImageOptimize\pngCrush\pngcrush.exe',
    'jpegtran' => 'E:\Server\_ImageOptimize\jpegtran\jpegtran.exe',
    'gifsicle' => 'E:\Server\_ImageOptimize\gifsicle\gifsicle.exe',
    'pngquant' => 'E:\Server\_ImageOptimize\pngquant\pngquant.exe',
    'pngout' => 'E:\Server\_ImageOptimize\pngout\pngout.exe'
   );

y llámalo así

   self::$my_paths['pngcrush'];

Si es posible, también podría hacer que su variable my_path sea estática.

self::my_paths['imagemagick'] no funciona, porque la matriz es privada y no se puede usar en un contexto estático.

Haga que su variable sea estática y debería funcionar.

Los métodos estáticos en una clase no pueden acceder a las propiedades no estáticas en la misma clase.

Debido a que se puede llamar a los métodos estáticos sin una instancia del objeto creado, la pseudovariable $this no está disponible dentro del método declarado como estático.

Si no desea acceder a las propiedades de la misma clase, debe definirlas como estáticas.

Example: 
class A{
    public function __construct(){
        echo "I am Constructor of Class A !!<br>";
    }

    public $testVar = "Testing variable of class A";

    static $myStaticVar = "Static variable of Class A ..!<br>";

    static function myStaticFunction(){

  //Following will generate an Fatal error: Uncaught Error: Using $this when not in object context 
      echo $this->testVar;

 //Correct way to access the variable..
    echo Self::$myStaticVar;

    }
}

$myObj = new A(); 
A::myStaticFunction();

¿Ha sido útil esta solución?