class a{ var $_name=""; function getname() { return $this->_name; } function a($name) { $this->_name = $name; } } class b{ var $_name=""; function getname() { return $this->_name; } function b($name) { $this->_name = $name; } } class link { // static var static $_links = array(); var $a; var $b; function link() { self::$_links[] = &$this; } // static method function getLinkedItem($s) { foreach(link::$_links as $link) { if ($link->isALinkOf($s)) { return $link; } } return new link(); } function isALinkOf(&$s) { return ($this->a === $s || $this->b === $s); } function getA() { return $this->a; } function getB() { return $this->b; } } $a = new a('john'); $b = new b('locke'); $link = new link(); $link->a=$a; $link->b=$b; // Get linked item of $a $foo = link::getLinkedItem($a); var_dump($foo->getB());