You can check the caller using debug_bugtrace()
class Foo
{
  public function __construct()
  {
    $bar = new Bar();
    $bar->test();
  }
}
class Bar
{
  public function test()
  {
      $trace = debug_backtrace();
      if (isset($trace[1])) {
          // $trace[0] is ourself
          // $trace[1] is our caller
          // and so on...
          var_dump($trace[1]);
          echo "called by {$trace[1]['class']} :: {$trace[1]['function']}";
      }
  }
}
$foo = new Foo();
This example prints called by Foo :: __construct
Then you can check the caller's name and deny instatiation when the caller is not the one 
Find out which class called a method in another class