• Почему php функции include/require просто ничего не делают?

    @Pe3oHaHc Автор вопроса
    Проблему я нашел - это шорт теги <? ?> во включаемых файлах. Но теперь другая проблема - не выводится ошибок при их нахождении. Я даже свою функцию логирования ошибок написал и установил её с set_error_handler. Эта функция должна перехватывать вообще все ошибки, правильно?
  • Почему php функции include/require просто ничего не делают?

    @Pe3oHaHc Автор вопроса
    Мм, но буфер потом выводится на экран(
  • Почему php функции include/require просто ничего не делают?

    @Pe3oHaHc Автор вопроса
    Я весь день за этой фигней сижу и я пытался получить ошибки половину из этого дня) Не выводит никаких ошибок даже если я error_reporting(E_ALL); прямо перед require_once ставлю. Внутри включаемого файла нету управления выводом ошибок.
  • Почему php функции include/require просто ничего не делают?

    @Pe3oHaHc Автор вопроса
    1. Всё включено, ворнинги выводятся.
    2. Как надо работает то, что компилятор выдает ошибку когда я выполняю require_once 'void'; в начале файла и не выдает совсем никаких ошибок если я помещаю его внутрь класса.
  • Почему php функции include/require просто ничего не делают?

    @Pe3oHaHc Автор вопроса
    Может кто знает как заставить компилятор выдавать предупреждение при обнаружении старомодной записи <? ?> ?
  • Почему php функции include/require просто ничего не делают?

    @Pe3oHaHc Автор вопроса
    Мм, вопрос, блин, снимается. Оказалось внутри включаемого файла были скобки <? без php.
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Повторюсь, события могут содержать не только персонажи, но и объекты. В этом случае ваш вариант предполагает написание множества повторяющегося кода.
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Мм, а мне и не нужно знать какого типа объект, добавляющий реакию на событие. Мне нужно лишь знать является ли он персонажем или нет.

    Если это персонаж, то мне надо так же проверить является ли он владельцем события и если это так, то осуществить подписку. Так как и событие и реакция содержат ссылку на объект-контейнер, это становится возможным.

    Если же это объект, то мне надо убедиться, что нет попытки добавить к его событию реакцию персонажа — это привело бы к вмешательству в личное пространство персонажа. Однако, если подписаться на событие объекта пытается другой объект (не персонаж), позволять ему это.
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Хотя я кажется вас не правильно понял… что вы имеете ввиду под «код может подписаться на события» и «код возвращает Object»? Какой объект вы имеете ввиду под «кодом»?
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Мм, объект может содержать события. Но динамически создавать их не может никто. А в случае Object я использую instanceof чтобы проверить является ли объект Person'ом или нет.
    Вообще поддержка событий не помешала бы языку. В C#, например, есть такая. Будь она и в джаве — не пришлось бы так мучаться.
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Ок, а когда у Person множество событий? Делать для каждого из них метод получения события + объект внутри?
    Насчет моего варианта повторюсь, для меня главное удобство использования. Проблема для меня была не в том чтобы сделать максимальную защиту от индуса, а чтобы позволить мне быстро и просто создавать события у различных объектов и быстро и просто на них подписываться. И загвоздка была в том, что я сам, а не индус, мог подписать на событие то и тех, кого подписывать нельзя, и, естественно, не заметить это. А потом долго и трудно искать почему у меня потоки вмешиваются в работу друг друга и портят результаты. Тот вариант, что предложил я, мою проблему решает :) Возможно я недостаточно ясно изложил свои пожелания вначале, за что прошу прощения. Я в первый раз прибег к помощи подобного ресурса и еще не научен правильно излагать проблему. Но я исправлюсь, надеюсь :)
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Мм, да, получается без интерфейса вроде HasEvents все равно не обойтись, т.к. надо чтобы у всех имеющих события классов был в наличии метод getEvent(). Это грустно(

    Я тут подумал, можно пойти другим путём. Я могу обеспечить проверку на доступ в том случае, если объекты Event будут знать в каком объекте они находятся, а методы addReaction() и fire() будут знать из какого объекта они вызываются. И если если среда не позволяет предоставить им эту информацию на этапе компиляции можно сделать это на этапе выполнения. Получится что-то вроде:

    class Event
    {
       private Object mContainer;
    
       public Event(Object container) { mContainer = container; }
    
       public void fire(Object caller) { /*проверить что mContainer равно caller. Если что - кинуть исключение. */ }
       public void addReaction(Reaction reaction) { /* проверить где содержится reaction и какого типа mContainer и действовать соответственно.*/ }
    }
    class Reaction
    {
       Object mContainer;   
    
       public Reaction(Object container) { mContainer = container; }
       public abstract void react(...);
    }
    


    С такой схемой придется условиться передавать this в конструкторы Event, Reaction и в метод fire(), чтобы дать Event'у нужную информацию. Это не идеально, но близко к тому что я хотел. Да, конечно, вместо this можно передать что-то другое и в этом случае всё пойдет коту под хвост, но подумав я понял что этот вариант меня устраивает так как я пишу этот фреймворк в основном для того чтобы обкатать новые понятия и если я и буду пускать его в продакшн так только как часть чего-то большего. Так что мне важнее удобство пользования и минимализация возможных ошибок. Спасибо, без вас было бы сложнее)
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Этот вариант сработает, не спорю. Но он довольно трудоемок. Придется вводить идентификаторы событий, наследовать все корневые объекты от базового класса, реализовывать каждый раз вручную интерфейс там где не получилось унаследовать базовый класс. Слишком много мороки) К тому же, если появится еще что-то подобное событиям, то применить эту схему еще раз не получится — придется доставать костыли. Я попробую способ с внутренним классом, но спасибо за попытку)
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Мм, минут пятнадцать глядел на второй пример. Либо что-то не правильно либо я торможу) Я не могу понять как должны применяться объекты этих классов. В классе-владельце события я должен создавать публичный объект Event и приватный Event.Owner? Может тогда следует сделать Owner внутренним классом вместо статического?

    class Event
    {
       public void subscribe(...){}
    
       public class ForOwner
       {
          fire(...){}
          addReaction(...){}
       }
    }
    


    Если так, то это менее кривой способ чем все остальные) Попробую его.
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Второй вариант несколько неясен, но первый вариант мне нравится. Можно сделать OwnedEvent приватным для владельца классом, что предотвратит создание объектов этого класса вне него. Спасибо! Это шикарно)
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Мм, есть одно но — событий может быть несколько. Придется делать почти так как в этом паттерне, но делать два интерфейса — для подписки на события и для добавления реакции. При этом проверять не пытаюсь ли я добавить реакцию персонажа в событие объекта и не пытаюсь ли я добавлять реакцию одного персонажа к событию другого.
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Нехорошо наследовать то, чем объект не является. Person это всё таки «человек» и он мог бы наследоваться от, например, класса Human. К тому же события может содержать любой объект и если он уже от чего-то унаследован эта схема рушится. Но в целом мысль правильная. Всё это решается с помощью интерфейса. Только вот выглядеть это всё будет совсем не лаконично(
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Хорошо, права доступа между персонажами я могу распределить. Я могу проверять в методе тот ли поток, который создавал событие, пытается выполнить эти методы. Но всё равно остается проблема с объектами, которые не являются персонажами. Например, электрический чайник имеет событие «вода вскипела». Это событие может инициировать только чайник, но «подписаться» и следить за ним может любой человек в комнате. И получается что чайник имеет полный доступ к событию, а люди в комнате могут только подписаться на событие.
    Всё это можно реализовать через интерфейсы, но это будет очень неудобно в пользовании. Я бы очень хотел чтобы для работы с событием было достаточно лишь добавить его в класс. Хотя я начинаю подозревать что такое невозможно(
  • Как ограничить вызов метода владельцем объекта?

    @Pe3oHaHc Автор вопроса
    Да, я хочу именно этого. Надо чтобы методы addReaction() и fire() мог вызвать только владелец объекта-события.
    То что вы предлагаете почти что подходит. Но есть еще один нюанс. Объект типа Event может присутствовать не только у класса Person. Он так же может быть у любого объекта в системе. И реализовывать в каждом объекте лишний интерфейс будет неудобно. К тому же я не хочу ограничивать доступ к событиям т.к. это усложнит синтаксис работы с ними.