Я посмотрел и попытался, но я не могу найти ответ.
В 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"); ?>
К сожалению, у 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
Просто сделайте это (в PHP> = 5.4):
$t = (new Test("Hello"))->foo("world");
Я тоже искал один лайнер, чтобы выполнить это как часть одного выражения для преобразования дат из одного формата в другой. Мне нравится делать это в одной строке кода, потому что это единая логическая операция. Итак, это немного загадочно, но позволяет создавать и использовать объект даты в одной строке:
$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');
Я думаю, что объектно-ориентированный подход является прохладным и необходимым, но иногда это может быть утомительным, требуя слишком много шагов для выполнения простых операций.
Вы не можете вызвать метод уровня экземпляра без экземпляра. Ваш синтаксис:
echo Test("world")::alert("hello");
не имеет большого смысла. Либо вы создаете встроенный экземпляр, либо сразу отбрасываете его, либо метод alert()
не имеет никакого имплицитного экземпляра.
Предполагая, что:
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 (например, с использованием индексации массива при возврате функции). Так оно и есть.