amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/...

о-нибудь есть хорошие примеры использования статических методов вместо динамических?

Ответы на вопрос(4)

а, которые могут принимать разные аргументы.

Class DBConnection
{
    public static function createFromConfiguration(Configuration $config)
    {
        $conn = new DBConnection();
        $conn->setDsn($config->getDBDsn());
        $conn->setUser($config->getDBUser());
        $conn->setPassword($config->getDBPass());

        return $conn;
    }

    public static function newConnection($dsn, $user, $password)
    {
        $conn = new DBConnection();
        $conn->setDsn($dsn);
        $conn->setUser($user);
        $conn->setPassword($password);

        return $conn;
    }
}
 SlappyTheFish14 янв. 2011 г., 08:54
@Kyle Wikipedia - хорошее место для начала:en.wikipedia.org/wiki/Design_Patterns и если вы хотите больше, посмотрите на некоторые классические книги:amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/...
 Stephen13 янв. 2011 г., 23:24
Есть лучший способ подделать перегрузку метода. PHP имеет несколько крутых магических методов, таких как__call помогать. Проверь это:dinke.net/blog/en/2007/08/01/method-overloading-in-php5
 Kyle Humfeld14 янв. 2011 г., 00:08
Где вы узнаете об этих шаблонах и их названиях?
 Stephen13 янв. 2011 г., 22:55
Я не знаю, если мне нравится эта реализация. Я думаю, стратегия будет лучше.
 SlappyTheFish13 янв. 2011 г., 23:12
Шаблон стратегии инкапсулирует объекты, это фабричная система для создания объектов. Это обходной путь отсутствия поддержки метода, в данном случае конструктора, перегрузки в PHP.

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

$b = new Bank;

Допустим, вы хотите добавить нового сотрудника в этот банк. Просто позвоните:

$b->addEmployee( 'Person' );

Поскольку вы применяете действие к созданному вами банку, а не к компании, которая владеет банком в целом, вы используете метод участника. Теперь предположим, что компания продала некоторые активы и заработала деньги. Чтобы обновить их общую сумму, вы бы назвали это:

Bank::addToCompanyBalance( 1000000 );

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

Конечно, этот пример очень упрощен, но мне нравится аналогия. В более программном смысле статические члены хороши для:

Одиночки

class Singleton
    private static $instance;

    private function __construct() {}
    private function __clone() {}

    public static function getInstance() {
        if( !isset( self::$instance ) ) self::$instance = new IamOne;
        return( self::$instance );
    }
}

Создание классов, которые могут потерпеть неудачу
Ex. Класс обработчика файлов может не всегда хотеть создать новый объект (скажем, переданный файл не существует или не может быть открыт).

С абстрактными классами
Некоторые классы могут не захотеть иметь экземпляры (например, маршрутизатор, который интерпретирует запрос пользователя). Абстрактные классы, однако, могут вызываться статически и поэтому могут использовать статические методы.

 Phil Tune01 апр. 2015 г., 23:56
Это мне очень помогло. Иногда это действительно помогает использовать реальный пример, такой как ваш банк, вместо того, чтобы показывать слишком технические варианты использования, которые могут не иметь никакого смысла для кого-то, кто не знаком с этой концепцией (* cough * большая часть документации PHP.net). Я только начал учиться использовать классы для создания плагинов и хотел знать, почему люди используют статические и нестатические методы и свойства.

ой функции. Вам не нужен прямой доступ ко всему объекту БД, вам просто нужен доступ к ресурсу соединения. Так что вы можете позвонить

 $connection = new DatabaseConnection();
 StaticClass::setDatabase($connection);
 $result = StaticClass::getDatabaseConnection()->query();

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

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

function getUsers()
{
     $users = StaticClass::getDatabaseConnection()->query('SELECT * FROM users');
}
Синглтон:
class SingletonClass {
    private static $instance;
    private function __construct() { }
    public function __clone() {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }
    public static function init() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
    // other public, dynamic methods for singleton
}

$singleton = SingletonClass::init();
Отслеживание количества экземпляров:
class CountMe {
    public static $instances = 0;
    public function __construct() {
        CountMe::$instances++;
    }
    public function __destruct() {
        CountMe::$instances--;
    }
}
$a = new CountMe();
$b = new CountMe();
echo CountMe::$instances; // outputs 2
 Shoe13 янв. 2011 г., 23:09
Что-то пропало. Почему вы использовали init () вместо __construct? Почему я должен вызывать init () вместо того, чтобы просто использовать метод, который мне нужен, и позволить классу создать свой экземпляр в __construct?
 Bailey Parker13 янв. 2011 г., 23:14
Вся цель синглтона в том, чтобы быть именно таким: одиночным. Эта структура предотвращает создание нескольких экземпляров объекта.
 Stephen13 янв. 2011 г., 23:19
Наконец, если вам был предоставлен доступ к__constructвам придется создавать экземпляр класса каждый раз, когда вы хотите получить его экземпляр, то есть: ни единого экземпляра.
 Stephen13 янв. 2011 г., 23:13
Потому что конструктор является частным. Это гарантирует, что вы не можете создать класс самостоятельно. Вы должны пройти через метод init, и метод init либо возвращает один экземпляр, либо создает его и возвращает его. Таким образом, у вас всегда будет только один экземпляр класса.
 Stephen13 янв. 2011 г., 23:15
Другими словами: вы не можете сделать это$var = new SingletonClass(); потому что ошибка будет брошена. Но статический метод может сделать этоself::$instance = new $c; потому что он имеет доступ к частному конструктору.

Ваш ответ на вопрос