2012-02-22 71 views
2

我一直在用Java來做這種類型的事情,而且我試圖弄清楚它是否可以在PHP中使用。這是我期望的語法,如果它是可能的,但我想知道是否有一些特殊的方式來做到這一點(如果可能的話,那是)。類定義爲另一個類的靜態成員

class Foo { 
    public static class FooBarException extends Exception { 
    } 
    public static class BarBazException extends Exception { 
    } 

    public function DoSomething() { 
     try { 
      // Calls to other class methods that can 
      // throw FooBarException and BarBazException 
     } catch (self::FooBarException $e) { 
      // Stuff.. 
     } 
    } 
} 

$bang = new Foo(); 
try { 
    $bang->DoSomething(); 
} catch (Foo::BarBazException $e) { 
    // Stuff.. 
} 
+0

順便說一句,我忘了是否有一個真正的名字來做這個,用任何語言。我認爲它是「子類」,但那將用作「FooBarException是Exception的子類」... – Izkata 2012-02-22 21:16:39

+0

除了你的旁邊,我認爲你正在尋找'內部類',並且這裏有一個類似的鏈接問題:http://stackoverflow.com/questions/4351782/how-do-i-use-inner-classes-in-php簡短回答是'不' – 2012-02-22 21:19:38

+0

它也被稱爲「嵌套類」。 – linepogl 2012-02-22 21:20:19

回答

3

不,你不能。但是,在PHP 5.3中引入的是namespaces。用命名空間你可以做同樣的事情:

<?php 
namespace MyNamespace 
{ 
    use Exception; 

    class FooBarException 
     extends Exception 
    { 
    } 

    class FooBazException 
     extends Exception 
    { 
    } 

    class Foo 
    { 
     public function doSomething() 
     { 
      throw new FooBarException; 
     } 
    } 
} 

namespace AnotherNamespace 
{ 
    $bang = new \MyNamespace\Foo; 
    try { 
     $bang->doSomething(); 
    } catch(\MyNamespace\FooBarException $up) { 
     throw $up; // :) 
    } 
} 
+0

令人失望,但+1和接受,因爲我甚至不知道名稱空間。 – Izkata 2012-02-22 21:33:03

1

不,這是不可能的。

但是,您可以使用名稱空間獲得類似的效果。