PHP 7 значительно упрощает создание абстрактных «свойств». Как и выше, вы создадите их, создав абстрактные функции, но с помощью PHP 7 вы можете определить тип возвращаемого значения для этой функции, что значительно упрощает создание базового класса, который может расширять каждый.
<?php
abstract class FooBase {
abstract public function FooProp(): string;
abstract public function BarProp(): BarClass;
public function foo() {
return $this->FooProp();
}
public function bar() {
return $this->BarProp()->name();
}
}
class BarClass {
public function name() {
return 'Bar!';
}
}
class FooClass extends FooBase {
public function FooProp(): string {
return 'Foo!';
}
public function BarProp(): BarClass {
// This would not work:
// return 'not working';
// But this will!
return new BarClass();
}
}
$test = new FooClass();
echo $test->foo() . PHP_EOL;
echo $test->bar() . PHP_EOL;
Я постоянно использую способ 1:
class Foo
def self.bar
puts 'class method'
end
end
Он не является подробным и сохраняет метод в том же контексте класса.
Я предпочитаю способ 1, поскольку он не зависит от контекста. Я не люблю прыгать в середину файла, а затем прокручивать вверх или вниз, чтобы увидеть, означает ли отступ, что я нахожусь в блоке class << self
, или это просто вложенный модуль.
Я использую способ №3, но я думаю, что способ №1 тоже хорош. Это зависит от вашего использования. Если вы хотите, чтобы ваш код можно было «вырезать / вставить» в другие модули и классы, то лучше вариант №1. Я использую Способ №3, чтобы сделать вырезание / вставку кода более болезненным, b / c мантра Ruby - «не повторяйся», поэтому не следует вырезать / вставлять код очень часто ..
Согласен с большинством пользователей. Я обычно использую в первую очередь
# Way 1
class Foo
def self.bar
puts 'class method'
end
end
. Если я правильно помню, есть некоторые небольшие отличия, которые показаны на переговорах по метапрограммированию прагматичных программистов (которые я рекомендую), которые связаны с тем, как вызывается и выполняется код класса.
Но они были довольно маленькими, и в основном это были вещи, с которыми нам не придется иметь дело в обычном режиме. Посмотрим, смогу ли я проверить их и опубликовать.
Я считаю << добавление метода слишком необычным (хотя я с удовольствием использую << со строками и вводом-выводом).
Я избегаю Foo.bar, потому что это означает повторение самого себя.
Обычно я предпочитаю def self.foo
для отдельных методов и class << self
для длинных отрезков методов класса. Я чувствую, что это делает различие между частью метода класса и частью метода экземпляра в определении класса.