Какая польза от статических функций в ООП? - PullRequest
3 голосов
/ 14 июля 2011

Какая польза от static functions в ООП?

Как это отличается от другой функции?

Ответы [ 4 ]

6 голосов
/ 14 июля 2011

В качестве очень простого, несколько надуманного примера:

class Foo {

    protected $bar = null;
    protected $baz = null;

    public function __construct($bar, $baz) {
        $this->bar = $bar;
        $this->baz = $baz;
    }

    public static function instantiateFromArray(array $data) {
        return new self($data['bar'], $data['baz']);
    }

}

$foo = new Foo('bar', 'baz');
// or
$foo = Foo::instantiateFromArray(array('bar' => 42, 'baz' => 'nine'));

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

Как правило, статические функции обеспечивают функциональность вокруг объекта без необходимости его создания.Есть много применений для этого.По крайней мере, полностью статические классы, которые никогда не создаются, могут использоваться для объединения функций и связанных данных, что само по себе делает код чище.Вот чем они отличаются от обычных функций: обычные функции не могут сохранять «внешние» данные (без использования глобальных переменных, которые вы не хотите делать), методы статического класса могут сохранять данные в свойствах статического класса.

3 голосов
/ 14 июля 2011

Вам не нужно создавать экземпляр объекта для использования статических методов / свойств.

Из-за этого они не могут сохранять свое состояние в объекте.

Они часто используются как способ для методов, связанных с пространством имен, например,

echo str::truncate($str, 100);
1 голос
/ 14 июля 2011

Статические функции используются для вызова кода класса, когда ни один из его экземпляров не существует (на более чистых языках). Статические функции могут изменять статические переменные.

0 голосов
/ 14 июля 2011

Объявление свойств или методов класса как статических делает их доступными без необходимости создания экземпляра класса. К свойству, объявленному как статическое, нельзя получить доступ с помощью экземпляра объекта класса (хотя статический метод может).

Для совместимости с PHP 4, если не используется объявление видимости, свойство или метод будут обрабатываться так, как если бы они были объявлены как публичные.

Поскольку статические методы могут вызываться без экземпляра созданного объекта, псевдопеременная $ this недоступна в методе, объявленном как static.

Статические свойства не могут быть доступны через объект с помощью оператора стрелки ->.

При вызове нестатических методов статически генерируется предупреждение об уровне E_STRICT.

Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с использованием литерала или константы; выражения не допускаются. Поэтому, хотя вы можете инициализировать статическое свойство целым числом или массивом (например), вы не можете инициализировать его другой переменной, возвращаемым значением функции или объектом.

class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}


print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // Undefined "Property" my_static 

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...