2010-06-23 4 views
4

Ive посмотрел и попытался, но я не могу найти ответ.метод класса вызова (с конструкторами) без создания объекта в php

В 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"); 

?> 
+0

Я думал эхо Test :: __ конструктов ("мир") :: предупреждение ("привет"); может работать, но это не так, вздохнуть – mykchan

+0

сделать предупреждение() статической функции выполнит эту работу. –

ответ

0

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

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 (например, с использованием индексации массива при возврате функции). Так оно и есть.

+1

Я создаю встроенный экземпляр и немедленно отбрасываю его. я не понимаю, почему мне нужно выделить переменную для этого процесса ... так это то, как PHP/OOP? – mykchan

18

К сожалению, 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 
1

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

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

Другим способом одной линии преобразования финиковых строки из одного формата в другой заключается в использовании вспомогательная функция для управления ОО частей коды:

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

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

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

4

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

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