Что, Отображают/Уменьшают?

Неустранимая ошибка: использование $ this, если не в контексте объекта

$this - специальная переменная в PHP , которая не может быть назначена. Если он доступен в контексте, где он не существует, эта фатальная ошибка указывается.

Эта ошибка может возникнуть:

  1. Если нестатический метод называется статическим , Пример:
    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    
    Как исправить: снова просмотрите свой код, $this может использоваться только в контексте объекта и никогда не должен использоваться в статическом методе. Кроме того, статический метод не должен обращаться к нестатистическому свойству. Используйте self::$static_property для доступа к статическому свойству.
  2. Если код из метода класса был скопирован в нормальную функцию или только глобальную область и , сохраняя специальную функцию $this переменная. Как исправить: Просмотрите код и замените $this на другую переменную замещения.

Вопросы, относящиеся:

  1. Вызов нестатический метод как статический: PHP Неустранимая ошибка: использование $ this, если не в объектном контексте
  2. Копировать код: Неустранимая ошибка: использование $ this, если не в объекте context
  3. Все «Использование $ this, если не в контексте объекта» Вопросы по Stackoverflow

83
задан Peter O. 9 January 2013 в 08:20
поделиться

4 ответа

Из краткого обзора Google страница MapReduce публикации исследования:

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

преимущество MapReduce состоит в том, что обработка может быть выполнена параллельно на нескольких процессорных узлах (несколько серверов), таким образом, это - система, которая может масштабироваться очень хорошо.

, Так как это базируется от функциональное программирование модель, map и reduce шаги, у каждого нет побочных эффектов (состояние и результаты каждого подраздела map процесс не зависит от другого), таким образом, набор данных, отображаемый и уменьшенный, может каждый быть разделен по нескольким процессорным узлам.

Joel Ваш Язык программирования может Сделать Это? часть обсуждает, как понимание функционального программирования было важно в Google для предложения MapReduce, который приводит в действие его поисковую систему. Это - очень хорошее чтение, если Вы незнакомы с функциональным программированием и как это позволяет масштабируемый код.

См. также: Википедия: MapReduce

Связанный вопрос: объясните mapreduce просто

68
ответ дан Community 24 November 2019 в 08:56
поделиться

MapReduce, Объясненный .

Это объясняет лучше, чем, что я могу. Это помогает?

16
ответ дан Srikanth 24 November 2019 в 08:56
поделиться

Карта является функцией, которая применяет другую функцию ко всем объектам в списке, для создания другого списка со всеми возвращаемыми значениями на ней. (Другой способ сказать "применяется, f к x" является "вызовом f, передавая его x". Таким образом, иногда звучит более хорошим сказать, "применяются" вместо "вызова".)

Это - то, как карта, вероятно, записана в C# (это звонило Select и находится в стандартной библиотеке):

public static IEnumerable<R> Select<T, R>(this IEnumerable<T> list, Func<T, R> func)
{
    foreach (T item in list)
        yield return func(item);
}

, Поскольку Вы - чувак Java, и Joel Spolsky нравится говорить ЧРЕЗВЫЧАЙНО НЕСПРАВЕДЛИВУЮ Ложь, как дрянной Java (на самом деле, он не лежит, это дрянно, но я пытаюсь выиграть Вас), вот моя очень грубая попытка версии Java (у меня нет компилятора Java, и я неопределенно помню версию 1.1 Java!):

// represents a function that takes one arg and returns a result
public interface IFunctor
{
    object invoke(object arg);
}

public static object[] map(object[] list, IFunctor func)
{
    object[] returnValues = new object[list.length];

    for (int n = 0; n < list.length; n++)
        returnValues[n] = func.invoke(list[n]);

    return returnValues;
}

я уверен, что это может быть улучшено миллионом способов. Но это - основная идея.

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

В C# уменьшают, назван Aggregate и находится снова в стандартной библиотеке. Я пропущу прямо к версии Java:

// represents a function that takes two args and returns a result
public interface IBinaryFunctor
{
    object invoke(object arg1, object arg2);
}

public static object reduce(object[] list, IBinaryFunctor func)
{
    if (list.length == 0)
        return null; // or throw something?

    if (list.length == 1)
        return list[0]; // just return the only item

    object returnValue = func.invoke(list[0], list[1]);

    for (int n = 1; n < list.length; n++)
        returnValue = func.invoke(returnValue, list[n]);

    return returnValue;
}

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

string[] names = getLotsOfNames();

string commaSeparatedNames = (string)reduce(names, 
   new IBinaryFunctor {
       public object invoke(object arg1, object arg2)
           { return ((string)arg1) + ", " + ((string)arg2); }
   }

, Надо надеяться, дженерики избавились бы от бросков. Безопасный с точки зрения типов эквивалент в C#:

string commaSeparatedNames = names.Aggregate((a, b) => a + ", " + b);

, Почему это "прохладно"? Простые способы разбить большие вычисления в мелкие кусочки, таким образом, они могут быть соединены назад по-разному, всегда прохладны. Путем Google применяется, эта идея к распараллеливанию, потому что и карта и уменьшает, может делиться по нескольким компьютерам.

, Но ключевое требование то, Не то, чтобы Ваш язык может рассматривать функции как значения. Любой язык OO может сделать это. Фактическое требование для распараллеливания - то, что мало func функции Вы передаете карте и уменьшаете, не должен использовать или обновлять любое состояние. Они должны возвратить значение, которое зависит только от аргумента (аргументов), переданного им. Иначе результаты будут полностью завинчены, когда Вы попытаетесь выполнить все это параллельно.

16
ответ дан Daniel Earwicker 24 November 2019 в 08:56
поделиться
Другие вопросы по тегам:

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