2014-08-29 76 views
0

我正在学习如何面向对象,我想知道如何为新创建的对象分配新的名称属性,例如“NoName”,当给定的名称是非法的(在这种情况下,少于2个单词或更长比50个字)。目前,当我创建一个新的对象时,它仍然显示名称“E”,而它应该显示“NoName”。我的if else语句有什么问题吗?PHP - 创建对象时如何在非法名称的情况下分配新的名称属性?

这里的类:

<?php 
class Person { 

private $name; 

public function __construct($name){ 
$this->name=$name; 
} 

public function setName($name){ 
    if((strlen($name)>=2) && (strlen($name)<=50)){ 
    $this->name=$name; 
    $accepted = true; 
    }else{ 
    $accepted = false; 
    $this->name="NoName"; 
    } 
    return $accepted; 
} 

public function __toString() { 
    $temp = "name of the person is " . $this->name; 
    return $temp;  
    } 
} 
?> 

这里是我创建的对象:

$p1 = new Person("Kenneth"); 
echo("<p>" . $p1 ."</p>"); 

$p2 = new Person("E"); 
echo("<p> Illegal name when created: " . $p2 ."</p>"); 
+1

你从来没有在你的构造函数中使用的setName。我想这就是你想要做的? – Sugar 2014-08-29 12:23:14

+0

那么你永远不会调用setname方法? – Steve 2014-08-29 12:23:22

+3

在您的构造函数中,您可以代替'$ this-> name = $ name;'do'$ this-> setName($ name);'尽管您的$ accepted'布尔值似乎未被使用 – Steve 2014-08-29 12:24:56

回答

0

的正确方法是抛出一个异常:

class Person { 

    private $name; 

    public function __construct($name) { 
     $this->setName($name); 
    } 

    public function setName($name) { 
     if (strlen($name) < 2 || strlen($name) > 50) { 
      throw new InvalidArgumentException('Name is too short or too long'); 
     } 
     $this->name = $name; 
    } 

} 
  • 是“物理”不可能设置不符合您的标准名称,因为否则会引发异常
  • 构造函数使用setName方法来执行此操作
  • 底线:这是不可能*有Person类的实例名称无效

*限制了实际运行时的语言黑客

2

你永远不会调用的setName方法 在你的构造你可以,而不是

$this->name=$name; 

do

$this->setName($name); 

虽然你$accepted布尔出现未使用

0
<?php 
class Person { 

    private $name; 

    public function __construct($name){ 
     $this->setName($name); 
    } 

    public function setName($name){ 
     if(preg_match('/.{2,50}/',$name) != 1){ 
      throw new DomainException("Invalid 'name' format."); 
     } 
     $this->name=$name; 
    } 

    public function __toString() { 
     return "name of the person is " . $this->name;  
    } 
} 


function CreatePersonHelper($name) { 
    try{ 
     return new Person($name); 
     echo("<p>" . $p1 ."</p>"); 
    } catch (DomainExcetion $e) { 
     return $e->getMessage(); 
    } catch (Exception $e) { 
     return 'Something went wrong'; 
    } 
} 

$names = array('Kenneth','e'); 
foreach ($names as $name) { 
    echo CreatePersonHelper($name); 
} 
相关问题