Определение методов класса в PHP

@Grantismo дает отличное объяснение в целом. Если вы хотите знать, кто на самом деле делает это, я предлагаю вам взглянуть на то, как Google сделал для приложения IO Google 2014 (всегда стоит внимательно изучить исходный код этих приложений, которые они выпускают. много, чтобы узнать оттуда).

Вот сообщение в блоге об этом: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm -google-io.html

По сути, со стороны приложения: GCM для сигнализации, адаптера синхронизации для сбора данных и правильной работы с поставщиком контента, который сделает вещи постоянными (да, он изолирует DB из прямого доступа из других частей приложения).

Кроме того, если вы хотите взглянуть на код 2015 года: https://github.com/google/iosched

7
задан Anant Singh---Alive to Die 5 June 2015 в 17:54
поделиться

7 ответов

Нет, с PHP 5.2. Однако можно использовать __call волшебный метод для перевода вызова к произвольной функции или методу.

class A {

    public function __call($method, $args) {
        if ($method == 'foo') {
            return call_user_func_array('bar', $args);
        }
    }

}

function bar($x) {
    echo $x;
}

$a = new A();
$a->foo('12345'); // will result in calling bar('12345')

В PHP 5.4 существует поддержка черт. Черта является реализацией метода (методов), который нельзя инстанцировать как автономный объект. Вместо этого черта может использоваться для расширения класса с помощью содержавшей реализации. Узнайте больше на Чертах здесь.

9
ответ дан 6 December 2019 в 09:23
поделиться

Вы могли, возможно, переопределить __ вызов или __ callStatic для определения местоположения отсутствующего метода во времени выполнения, но необходимо будет составить собственную систему для определения местоположения и вызова кода. Например, Вы могли загрузить класс "Делегата" для обработки вызова метода.

Вот пример - если бы Вы пытались назвать $foo-> панель (), то класс попытался бы создать класс FooDelegate_bar и панель вызова () на нем с теми же аргументами. Если у Вас есть настроенная автозагрузка класса, делегат может жить в отдельном файле, пока не требуется...

class Foo {

    public function __call($method, $args) {
        $delegate="FooDelegate_".$method;
        if (class_exists($delegate))
        {
             $handler=new $delegate($this);
             return call_user_func_array(array(&$handler, $method), $args);
        }


    }

}
3
ответ дан 6 December 2019 в 09:23
поделиться

Нет это не возможно. при определении функции/метода вне конструкции класса, это становится глобальной функцией.

0
ответ дан 6 December 2019 в 09:23
поделиться

Нет.

Можно расширить ранее объявленные классы, тем не менее, если это помогает.

1
ответ дан 6 December 2019 в 09:23
поделиться

C++ не может сделать этого также. Вы путали объявление с определением?

0
ответ дан 6 December 2019 в 09:23
поделиться

Нет, как все сказали, это не строго возможно.

Однако можно сделать что-то вроде этого, чтобы эмулировать смешивание в PHP или добавить методы к классу во времени выполнения, которое является почти настолько близко, как Вы собираетесь добраться. В основном это просто использует шаблоны разработки для достижения той же функциональности. Zope 3 делает что-то подобное для эмуляции mixins в Python, другой язык, который не поддерживает их непосредственно.

0
ответ дан 6 December 2019 в 09:23
поделиться

Да, можно добавить метод в класс PHP после его определения. Вы хотите использовать classkit , которое является «экспериментальным» расширением. Однако похоже, что это расширение не включено по умолчанию, поэтому это зависит от того, можете ли вы скомпилировать собственный двоичный файл PHP или загрузить библиотеки DLL PHP, если в Windows (например, Dreamhost разрешает настраиваемые двоичные файлы PHP, и их довольно легко настроить ).

<?php
class A { }
classkit_method_add('A', 'bar', '$message', 'echo $message;', 
    CLASSKIT_ACC_PUBLIC); 
$a = new A();
$a->bar('Hello world!');

Пример из руководства по PHP:

<?php
class Example {
    function foo() {
        echo "foo!\n";
    }
}

// create an Example object
$e = new Example();

// Add a new public method
classkit_method_add(
    'Example',
    'add',
    '$num1, $num2',
    'return $num1 + $num2;',
    CLASSKIT_ACC_PUBLIC
);

// add 12 + 4
echo $e->add(12, 4);
5
ответ дан 6 December 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: