1

PHP の例外を型キャストしたいと思います。次のコードを検討してください。

class myException extends Exception {
  function __construct( $mOrigin = "", $iCode = 0, Exception $oPrevious = null){
    if(is_string($mOrigin)){
      parent::__construct($mOrigin, $iCode, $oPrevious);
    } elseif ($mOrigin instanceof Exception) {
      parent::__construct($mOrigin->getMessage(),$mOrigin->getCode(),$mOrigin->getPrevious());
      $this->file = $mOrigin->getFile();
      $this->line = $mOrigin->getLine();
    } else {
      parent::__construct("\$mOrigin has wrong type", self::eFatal, $oPrevious);
    }
  }

アイデアは、標準の Exception を myException に変換して、元のスタック トレースを保持することです。トレースを保持する変数はプライベートであるため、これらの値をすぐにコピーすることはできず、CTOR は myException 用に新しい値を生成します。

最初のアイデアはもちろんクローンを使用することでしたが、$this を再割り当てすることはほとんどできませんね。

私がやろうとしているのは、C++ スタイルの型キャスト CTOR です。これを行うための賢明なパラダイムが PHP にありますか?

4

1 に答える 1

1

file&lineと同じようにtrace&previousを設定してみませんか?

class myException extends Exception {
  function __construct( $mOrigin = "", $iCode = 0, Exception $oPrevious = null){
    if(is_string($mOrigin)){
      parent::__construct($mOrigin, $iCode, $oPrevious);
    } elseif ($mOrigin instanceof Exception) {
      parent::__construct($mOrigin->getMessage(),$mOrigin->getCode(),$mOrigin->getPrevious());
      $this->file     = $mOrigin->getFile();
      $this->line     = $mOrigin->getLine();
      $this->trace    = $mOrigin->getTrace();
      $this->previous = $mOrigin->getPrevious();
    } else {
      parent::__construct("\$mOrigin has wrong type", self::eFatal, $oPrevious);
    }
  }

編集:

私が以前にこのコードで逃げた理由については、以下のコメントを参照してください。

myExceptionクラスをデコレータに変えてみませんか:

class myException extends Exception {
  private $_oException;

  function __construct( $mOrigin = "", $iCode = 0, Exception $oPrevious = null){
    if(is_string($mOrigin)){
      parent::__construct($mOrigin, $iCode, $oPrevious);
    } elseif ($mOrigin instanceof Exception) {
      $this->_oException = $mOrigin;
      parent::__construct($mOrigin->getMessage(),$mOrigin->getCode(),$mOrigin->getPrevious());
      $this->file     = $mOrigin->getFile();
      $this->line     = $mOrigin->getLine();
    } else {
      parent::__construct("\$mOrigin has wrong type", self::eFatal, $oPrevious);
    }
  }

  function getTrace()
  {
     return $this->_oException->getTrace();
  }

  function getPrevious()
  {
    return $this->_oException->getPrevious();
  }
}

さらなる情報:

私はphp-generalをフォローアップしましたが、これ意図された動作であり、Javaなどでも同じように機能することがわかりました。子クラスのメンバー変数をオーバーライドして、同じ名前の別のストアを作成できます。これはJavaで問題なくコンパイルされます

public class PrivateAccess
{
    private Boolean isAccessible = true;

    public Boolean getAccessible()
    {
        return isAccessible;
    }
}
class PrivateAccessChild extends PrivateAccess
{
    private Boolean isAccessible = false;

    public Boolean getAccessible()
    {
        return isAccessible;
    }

    public Boolean getParentAccessible()
    {
        return super.getAccessible();
    }

    public static void main(String[] args)
    {   
        PrivateAccessChild pAccess = new PrivateAccessChild();

        if(!pAccess.getAccessible())
            System.out.println("we're hitting the child here...");

        if(pAccess.getParentAccessible())
            System.out.println("we're hitting the parent here...");

        System.out.println("we're done here...");
    }
}
于 2012-07-12T14:56:54.897 に答える