2012-07-08 66 views
0

我想从Exception类的子类只处理错误,并给出错误代码发出适当的错误消息。为了说明我的问题,我更改了原始代码并使其更简单。PHP - 我可以创建一个不能通过另一个类实例化的类吗?

也许这是不可能的,但我不希望InvalidEmailException类被脚本实例化。如果有必要,我只是希望它可以被Subscribe类使用(发现错误)。无论如何,我为什么要这么做?无关紧要我只是想了解课程是如何运作的。

/* Child class from the parent Exception class to handle errors 
* pertinent to users being subscribed 
*/ 
class InvalidEmailException extends Exception{ 
    private $error_code; 
    private $email; 
    function __construct($error_code, $email){ 
     $this->error_code = $error_code; 
     $this->email = $email; 
     $this->notifyUser(); 
    } 
    function notifyUser(){ 
     if($this->error_code == 2): 
     echo "<p>Invalid email: <em>{$this->email}</em></p>"; 
     endif; 
    } 
} 

// Initial class to subscribe a user with the try catch checks 
class Subscribe{ 
    private $email; 
    private $error_code = 0; 
    function __construct($email){ 
     $this->email = $email; 
     $this->validateEmail(); 
    } 

    private function validateEmail(){ 
     try{ 
     if($this->email == ''): 
      throw new Exception('<p>Error: empty email address.</p>'); 
     else: 
      if($this->email == 'invalid test'){ 
        $this->error_code = 2; 
       throw new InvalidEmailException($this->error_code, $this->email); 
      }elseif($this->error_code == 0){ 
       // Go to method to subscribe a user if the error code remains zero 
       $this->subscribeUser(); 
      } 
     endif; 
     }catch(Exception $e){ 
     echo $e->getMessage(); 
     } 
    } 

    private function subscribeUser(){ 
     echo $this->email.' added to the database!'; 
    } 
} 

/* 
* Script to use the Subscribe class, which would call 
* the InvalidEmailException class if needed 
*/ 
$email = 'invalid test'; // This could later on be used through the $_POST array to take an email from a form 
$subscribe = new Subscribe($email); // Works well. 
$test = new InvalidEmailException('2', '[email protected]'); // Also works. I want this to throw an error. 
+0

如何加载类?与outoload或明确包括? – 2012-07-08 01:44:52

+0

我打算稍后使用自动加载功能。这只是一个例子。原谅我的无知,但了解我如何加载课程很重要? – 2012-07-08 01:48:00

+0

你试图效仿编程中的友谊或集会thingy(我。即某些类别/功能仅可用于某些其他功能/类别)。这可以在PHP中获得一些帮助,如何加载类。 – 2012-07-08 01:51:51

回答

1

我认为你最好的选择是使用依赖注入http://en.wikipedia.org/wiki/Dependency_injection。这有点高级,但我认为这将有助于从长远来看..

本质上,你可以创建一个通用接口,获取你需要的数据的方法,并使你的异常类的构造函数有一个类型的参数界面。然后让subscribe类实现接口,这将允许它传递给异常的构造函数。

您也可以直接将subscribe对象作为参数传递给异常类的构造函数,并绕过接口用法。但是,接口允许你有多个类都使用这个接口和那些常用的方法,如果你使用了这个模式,它们都可以构造你的异常类。而且当你使用相同的通用设计时,你也会知道如何与这些类进行交互。

这并不能完全阻止你从类的外部和脚本中构造异常,但是你需要构造一个首先实现接口的类(或者只是类本身,这取决于你的方式去),这是限制行为的好方法。

+0

哇,我只是一个新手。我不确定我了解你写的任何内容,并且我读了两遍。不过,我之前听说过接口,它应该是最高级别的?那么抽象类第二次呢?你能否以我更容易的方式再解释一遍?还有...几乎我的问题的PHP代码不能修改,使其工作?我必须从根本上改变它(戏剧性,戏剧性)......对吗? – 2012-07-08 02:37:30

+0

@Tolowe为您提供了一个很好的方法。你也可能想看看工厂模式:) – Lusitanian 2012-07-08 02:42:17

+0

接口基本上就像一个类必须实现某些方法的要求。在这种情况下,您可以使用GetEmail和GetErrorCode方法创建一个接口。如果你创建了一个接口IException,那么你的subscribe类实现它,你需要在那里定义方法。它在实例化时也像泛型一样工作。例如,你可以做一些事情,比如IException sub = new Subscribe();.因此,在您的EmailException类的构造函数中,可以传递参数(IException sub),并使用接口中定义的常用方法设置值。 – Tolowe 2012-07-08 02:48:25

-1

这是一个想法。

使用define来设置一个“全球化”变量。

在你的订阅类__construct功能

所以设置一个变量一样define('IN_USE', 1);,然后如果/当InvalidEmailException被称为只是检查:

if(!IN_USE) { exit; } 
+0

嘿,这是个好主意。这也是一个便宜的工作,但至少我仍然能够使用自动加载功能来加载我的脚本中的所有我的类根据请求。到目前为止,我认为这是我得到的关于这个问题的最合理的答案。非常感谢! – 2012-07-08 02:40:06

+0

我不知道发生了什么,我试图给一个投票,因为我认为这是有用的,它给了我一个消息,我需要15个声望来投票,然后它最终会给你一个投票下来这个答案... 奇怪的。 – 2012-07-08 02:44:49

+0

@JuanVeliz:标记接受这个答案通常意味着这是您使用的解决方案满足您的需求。你是这个意思吗? – chaos 2012-07-08 03:01:16

2

不,你不能真正有任何实物比其他类的可见性“对PHP中的任何事物都可见“。你可以用人们告诉你的各种黑客来部分地估计它,但是他们毫无意义的浪费时间,因为它们无法强制实现可见性约束(如果程序员想违反你的伪约束,所有这些都是微不足道的变通办法) ,如果它没有被强制执行,你可能只是在程序员级别实现它(即如果你不认为它应该完成,不要这样做)。

如果您担心的是使用非常有限的使用异常类来污染全局类名称空间(这将是一个值得赞扬的有效问题),这就是namespaces的用途;一个典型的专业PHP 5.3架构可以让你的课程为YourApp\Email\SubscribeYourApp\Email\InvalidAddressException。 (偶然允许Subscribe内的代码抛出new InvalidAddressException而不需要use声明或全名命名空间规范。)

+0

非常感谢。我需要确定知道这个类的可见性在PHP中是不存在的,除了'对任何事物都可见',哈哈哈,谢谢。 – 2012-07-08 02:46:06

相关问题