вызов метода класса (с конструкторами) без создания объекта в php - PullRequest
5 голосов
/ 23 июня 2010

Я посмотрел и попробовал, но не могу найти ответ.

В PHP возможно ли вызвать функцию-член класса (когда этому классу требуется конструктор для получения параметров), не создавая его экземпляр как объект?

Пример кода (который дает ошибки):

<?php

class Test {
    private $end="";

    function __construct($value) {
        $this->end=$value;
    }

    public function alert($value) {
        echo $value." ".$this->end;
    }
}

//this works:
$example=new Test("world");
$example->alert("hello");

//this does not work:
echo Test("world")::alert("hello");

?>

Ответы [ 4 ]

20 голосов
/ 23 июня 2010

К сожалению, PHP не имеет поддержки, чтобы сделать это, но вы изобретательный и выглядящий парень: D

Вы можете использовать «фабрику», образец:

<?php

class Foo
{
   private $__aaa = null;

   public function __construct($aaa)
   {
      $this->__aaa = $aaa;
   }

   public static function factory($aaa)
   {
      return new Foo($aaa);
   }

   public function doX()
   {
      return $this->__aaa * 2;
   }
}

Foo::factory(10)->doX();   // outputs 20
7 голосов
/ 19 марта 2014

Просто сделайте это (в PHP> = 5.4):

$t = (new Test("Hello"))->foo("world");
1 голос
/ 01 сентября 2011

Я тоже искал однострочник, чтобы выполнить это как часть единого выражения для преобразования дат из одного формата в другой.Мне нравится делать это в одной строке кода, потому что это одна логическая операция.Итак, это немного загадочно, но оно позволяет вам создавать и использовать объект даты в одной строке:

$newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : '');

Еще один способ однострочного преобразования строк даты из одного формата в другой -используйте вспомогательную функцию для управления OO-частями кода:

function convertDate($oldDateString,$newDateFormatString) {
    $d = new DateTime($oldDateString);
    return $d->format($newDateFormatString);
}

$myNewDate = convertDate($myOldDate,'F d, Y');

Я думаю, что объектно-ориентированный подход - это круто и необходимо, но иногда он может быть утомительным, требуя слишком много шагов для выполнения простых операций.

1 голос
/ 23 июня 2010

Вы не можете вызвать метод уровня экземпляра без экземпляра. Ваш синтаксис:

echo Test("world")::alert("hello");

не имеет большого смысла. Либо вы создаете встроенный экземпляр и немедленно его удаляете, либо метод alert() не имеет неявного экземпляра this.

Предполагая, что:

class Test {
  public function __construct($message) {
    $this->message = $message;
  }

  public function foo($message) {
    echo "$this->message $message";
  }
}

вы можете сделать:

$t = new Test("Hello");
$t->foo("world");

но синтаксис PHP не позволяет:

new Test("Hello")->foo("world");

, который в противном случае был бы эквивалентным. Есть несколько примеров этого в PHP (например, использование индексации массива при возврате функции). Так оно и есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...