Есть ли эквивалент «друга» или «внутреннего» в php? Если нет, существует ли какая-либо закономерность для достижения такого поведения?
Изменить: Извините, но стандартный Php – это не то, что я ищу. Я ищу что-то вроде того, что сделал рингмейстер.
У меня есть классы, которые выполняют системные вызовы C-стиля на заднем конце, и жонглирование стало громоздким. У меня есть функции в объекте A, которые принимают в объекте B как параметр и должны вызывать метод в объекте B, проходящем в нем как аргумент. Конечный пользователь может вызвать метод в B, и система развалится.
PHP не поддерживает никаких дружественных деклараций. Можно имитировать это с помощью методов PHP5 __get и __set и проверять обратную трассировку только для разрешенных классов друзей, хотя код для этого является довольно неуклюжим.
Вот пример кода и обсуждение темы на сайте PHP:
class HasFriends { private $__friends = array('MyFriend', 'OtherFriend'); public function __get($key) { $trace = debug_backtrace(); if(isset($trace[1]['class']) && in_array($trace[1]['class'], $this->__friends)) { return $this->$key; } // normal __get() code here trigger_error('Cannot access private property ' . __CLASS__ . '::$' . $key, E_USER_ERROR); } public function __set($key, $value) { $trace = debug_backtrace(); if(isset($trace[1]['class']) && in_array($trace[1]['class'], $this->__friends)) { return $this->$key = $value; } // normal __set() code here trigger_error('Cannot access private property ' . __CLASS__ . '::$' . $key, E_USER_ERROR); } }
(Код, доказанный tsteiner в netdclub dot net на bugs.php.net )
Также возможно повысить привилегии, а также выборочно протекать данные, используя рукопожатие и замыкания в php> = 5.3.3.
В основном, взаимодействие идет: класс A имеет открытый метод, который принимает объект класса B, и вызывает B-> grantAccess (или независимо от вашего интерфейса), передавая ему закрытие. Использование замыкания use($that,$anythingelseyouneed)
где $ this = $ this, и все, что вам нужно, чтобы определить, какие свойства разрешены для доступа. Закрытие имеет один аргумент – свойство возвращать; если это свойство на $, и все круто, замыкание возвращает свойство. В противном случае он возвращает '' или генерирует исключение или, может быть, значение по умолчанию.
Класс B-> grantAccess принимает вызываемый и сохраняет его, используя его другими способами, чтобы вырвать частные свойства, закрытие позволяет просочиться. Создайте конструктор класса B по умолчанию. Постройте B, используя статический заводский метод, который принимает аргумент класса A, чтобы убедиться, что рукопожатие происходит.
Gist здесь: https://gist.github.com/mcamiano/00592fb400e5043d8acd
Я уверен, что вы ищете «защищенный» или «закрытый», в зависимости от вашего варианта использования.
Если вы определяете функцию в классе и хотите только, чтобы она была доступна для себя, вы определите ее следующим образом:
private function foo($arg1, $arg2) { /*function stuff goes here */ }
Если вы определяете функцию в классе, который вы хотите использовать для классов, которые наследуются от этого класса, но недоступны публично, определенно это так:
protected function foo($arg1, $arg2)
Я уверен, что по умолчанию в PHP5 функции являются общедоступными, то есть вам не нужно использовать следующий синтаксис, но это необязательно:
public function foo($arg1, $arg2) { /*function stuff goes here */ }
Вам все равно придется создавать экземпляр объекта перед использованием публичной функции. Поэтому я просто буду тщательным и дам вам знать, что для использования функции в классе без создания экземпляра объекта обязательно используйте следующий синтаксис:
static function foo($arg1, $arg2) { /*function stuff goes here */ }
Это позволит вам использовать эту функцию, только ссылаясь на класс, следующим образом:
MyClass::foo($a1, $a2);
В противном случае вам нужно будет сделать следующее:
$myObject = new MyClass(); $myObject->foo($a1, $a2);