Благодарю вас, когда мне нужен материал, я сам нахожу его, а не прошу никого разжовывать... Ваши аргумены невероятны по мощи. Как я понял вы считаете, что есть какое-то "правильное" ООП и какие-то "правильные" языки, а есть отдельно убогий PHP? 20 самых популярных языков - посчитайте сколько здесь вариантов типизации и сколько вариантов ООП. И на скольки из этих языков можно сделать то, что вы хотите.
vasa_c Молодец, за идею борешься))) Где я говорил что считаю php, как язык убогим?) Главное приносит стабильный доход, значит заслуживает уважения, "правильное ООП" - ну хотябы, чтобы разработчик в функции, работая с определенным интерфейсом не мог случайно выйти за его пределы..., а в php эта тема очень слабо развито, разве тривиального instanceof достаточно? Лучше расскажи, какими проектами занимаешься ты, что тебя все абсолютно устраивает?
меня не устраивает очень многое, а сюда я просто попи...ть зашёл. PHP предоставляет возможность определить интерфейс и указать коду с каким интерфейсом он работает (type hinting). Прикладному коду предоставляется возможность работать с этим интерфейсом и никуда не лезть. Всякая IDE будет автодополнять методы только для этого интерфейса. А вот если программист захочет залезть внутрь в обход этого интерфейса, это его право. И ни Java, ни C++ ему в этом так же не помешают. У них есть плюшки, чтобы сделать это чуть сложнее, но к ООП это не относится. В Python'е же вообще модификаторов доступа и интерфейсов в виде конструкций языка нет, что не мешает ему считаться более ООП'шным и более правильным языком, чем многие из тех, в которых это есть.
PhpDoc имеешь ввиду? Если ты посмотришь выше, то написан метод, который не позволяет программисту выйти за пределы интерфейса
type hinting имею ввиду. PHP: public function(IName $object) {} Метод, несомненно забавный и его написание надеюсь доставило вам много удовольствия. Однако, если вы хотите действительно использовать его, то может лучше перейти на Яву всё-таки?
vasa_c Система под пых разрабатывается (вернее сейчас идет серьезное обновление), поэтому переходить на яву или на что то еще экономически не выгодно, к тому же где то неделя уйдет на изучение синтаксиса явы (я его не знаю))), да и впринципе даже без использование вышеизложенного метода все будет работать, просто метод даст сигнал в случаи ошибки программиста, за тайп хинтинг спсасибо, полезная вещь, не разбирался в ней, сейчас прочитал, но выше писали, что он не ограничивает объект интерфейсом, надо будет проверить
Не нравится мне всё это... Мне кажется не позволять программисту выходить за какие-то пределы должен начальник отдела при постановке задачи. Ну и сам программист и коллективное общение. Люди сидят за соседними столами и всегда могут посоветоваться, выйти в курилку и обсудить кто что и как пишет. А впихивать в ядро программы какие-то навороты специально, чтобы ограничить возможности других программистов - по мне так "не айс". Хотя я не вчитывался и, возможно, вообще не понял про что тут
iliavlad В этом то месте код нормальный, сейчас пробежался, в общем неправильно немного написал, нужно полностью разделять условия, когда вводятся доступные области и когда недоступные, как метод понадобится, так пару строк перепишу
Накидал получше вариантик PHP: <?php /** * Проверяет наличия доступа к методу * * @param array $objects типы объектов (или ключевое слово) * @param boolean $notIt (false - Только указанным, true - всем, кроме указанных) */ public function isAccessToMethod($objects, $notIt = false) { //Получаем данные от кого пришел запрос $debug = debug_backtrace(); $className = $debug[2]['class']; //Стандартный доступ $access = $notIt; if (class_exists($className, true) AND is_array($objects)) { //Получаем интерфейсы объекта, от которого пришел запрос (+autoload) $classInterfaces = class_implements($className, true); //Проверяем на ввод ключевого слова if (is_string($objects)) { switch ($objects) { case('privateObjects'): $objects = array('table', 'handler', 'driver', 'driverElement'); break; case('internalObjects'): $objects = array('table', 'handler', 'driver', 'driverElement', 'manager'); break; } } //Перебираем введенные объекты foreach ($objects as $v) { switch ($v) { case('table'): $interface = 'Table_interface_main'; break; case('manager'): $interface = 'Table_interface_manager'; break; case('handler'): $interface = 'Table_interface_handler'; break; case('driver'): $interface = 'Table_interface_driver'; break; case('driverElement'): $interface = 'Table_interface_driver_element'; break; default: exit('Not found element: ' . $v . ';'); } //Реализует ли интерфейс объекта $isAccess = isset($classInterfaces[$interface]); //В зависимости от типа запроса if ($notIt) { $access = ($access AND !$isAccess); } else { $access = ($access OR $isAccess); } } } if (!$access) { exit('not Access: ' . $debug[1]['class'] . '->' . $debug[1]['function'] . '; Caller: '.$debug[2]['class'].';'); } return true; }
А вот с привязкой к КОНКРЕТНЫМ объектам, посмотрите, кому интересно (конечно универсальный делать не к чему мне, пример дан в моем случаи) PHP: <?php /** * Проверяет наличия доступа к методу * * @param array $objects типы объектов (или ключевое слово) * @param boolean $notIt (false - Только указанным, true - всем, кроме указанных) * @todo Доделать, проверить, вставить, если надо */ public function isAccessToMethod($objects, $notIt = false) { //Получаем данные от кого пришел запрос $debug = debug_backtrace(); $className = $debug[2]['class']; $classObj = $debug[2]['object']; //Стандартный доступ $access = $notIt; if (class_exists($className, true) AND is_array($objects)) { //Проверяем на ввод ключевого слова if (is_string($objects)) { switch ($objects) { case('privateObjects'): $objects = array('table', 'handler', 'driver', 'driverElement'); break; case('internalObjects'): $objects = array('table', 'handler', 'driver', 'driverElement', 'manager'); break; } } $isAccess = false; //Перебираем введенные объекты foreach ($objects as $v) { switch ($v) { case('table'): $isAccess = ($this === $classObj); break; case('manager'): $isAccess = ($this->m_manager === $classObj); break; case('handler'): $isAccess = ($this->m_handler === $classObj); break; case('driver'): $isAccess = ($this->m_driver === $classObj); break; case('driverElement'): //Получаем интерфейсы объекта, от которого пришел запрос (+autoload) $classInterfaces = class_implements($className, true); if(isset($classInterfaces['Table_interface_driver_element'])){ $isAccess = ($this->m_driver->getElement($classObj->getId()) === $classObj); } break; default: exit('Not found element: ' . $v . ';'); } //В зависимости от типа запроса if ($notIt) { $access = ($access AND !$isAccess); } else { $access = ($access OR $isAccess); } } } if (!$access) { exit('not Access: ' . $debug[1]['class'] . '->' . $debug[1]['function'] . '; Caller: ' . $debug[2]['class'] . ';'); } return true; }
это всё бред. "Позволять программиту не вызвать метод програмно"?? Ха ха... Спорим я вызову метод? И мне ничего не помешает вообще. Ваша идея бредовая, хоть и кажется хорошей и типа что то делающей, но смысла в этом нет, потому что тупо давать мне ручку и листки и думать, что я ничего не напишу, если я могу...
Костян как кстати обходить собрался? Допустим есть система, закодированная гардом скажем, все финализировано, сериалайз магическим методом обрабатывается итд итп?
естественно я говорю о ручке и листике, которых я касаюсь... какая сигнализация? я итак знаю, что паблик я могу юзать, а другие не могу как бы... или ты для тупых делаешь?
Точно, ДЛЯ ТУПЫХ, я же писал, что есть паблики, которые для общения внутри структуры, а есть те, которые для общения с пользователем...
Костян Как ты его изменишь?) По нему zend guard пробежал, или хотябы ион куб, или как там из простеньких, как изменить то собрался?
karlozzz не тормози, я писал об этом выше... вообщем делай для ламеров, тебе никто не запрещает... жаль, что ты не понимаешь, но у тебя всё впереди...
Прочитал первую и эту страницу, может кто-то уже и писал, возможно топик стартеру поможет перезагрузка методов http://php.net/manual/en/language.oop5. ... ng.methods