如何在PHP类

时间:2016-01-03 21:20:45

标签: php oop dependency-injection static method-chaining

我已经知道如何在您创建该类的实例之前,在执行指定的函数之前首先执行的类中创建__construct()方法。我的类是静态的,有很多方法 - 都是静态的。

我想要实现的是创建一个在调用静态方法时始终执行的方法。这样做的目的是我想通过将另一个类的实例硬注入静态属性并使用static属性来访问其所有方法来创建单例类。

<?php 
class ArrayObject {

  private $input_array;

  private $output_array;

  //this method removes elements with null values
  public function clean(array $array)
  {
    #...code to remove empty value elements

    //set the value of the output to the output array
    $this->output_array  = $result;
  }

  //this method strips whitespace from array element
  public function trim(array $array)
  {
    #...code to remove whitespace

    //set the value of the output to the output array
    $this->output_array  = $result;
  }

  //this method returns the value of the $output_array
  public function getOutput()
  {
    return $this->output_array;
  }

}

上面是要作为依赖项注入静态类的对象类。下面是实现此ArrayObject的静态类

<?php 
class ArrayClass {

  private static $arrayObject;

  //this method sets the value of the $arrayObject
  private static function setArrayObject()
  {
    self::$arrayObject = new ArrayObject();

  }

  //this method removes elements with null values
  public static function clean(array $array = null)
  {
    #...call method to remove empty value elements

    self::$arrayObject->clean($array);

    return new static;
  }

  //this method strips whitespace from array elements
  public static function trim(array $array = null)
  {
    #...call method to remove whitespace
    self::$arrayObject->trim($array);

    return new static;
  }

  //this method returns the value of the $output_array
  public static function get()
  {
    return self::$arayObject->getOutput();
  }

}

我这样做的原因是我能够以这种方式链接方法ArrayClass::clean($array)->trim()->get();

您可能会说,但为什么不在静态类中执行所有这些操作而不是创建单独的对象来执行此操作 - 我必须创建两个类的原因是我希望一个类来处理数组操作而另一个类来处理数组操作在链接环境中获取数组参数,以便明确区分逻辑。

看到每个方法都需要一个有效的数组。我想对静态类做的是检查链式调用中传递的空值。如果方法调用为空,则静态类将从前一个调用获取输出数组,并将input_array作为第二个链接调用发送,这样当您想要链接操作时,只需将参数传递给第一个方法调用。

现在,希望你已经理解了这一切,我的问题是:如果以任何顺序调用任何数组操作方法,我怎样才能将public static function setArrayObject()设置为始终首先执行? - 无需在每个静态方法中首先调用此方法?并且没有用户整体将使用此类必须首先手动创建实例才能访问此功能?

我希望从用户的角度来看,这个类的使用是完全静态的。

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用 Factory 设计模式?通过这个你可以实现你调用静态方法创建一个对象的实例,你可以避免使用这样的奇怪的结构:ArrayClass::clean($array)->trim()->get();

示例:

<?php

class Array {

    // you can implement all your methods here

    public function getOutput() {
    }

    // ...

}

class ArrayFactory {

    public static function create($params) {
        // you can call all necessary cleaning methods here
        // before creating new object

        return new Array($params);
    }

}

// usage:

/** @var Array **/
$array = ArrayFactory::create($params);

希望这有帮助。