我从C#中学习了大部分OOP实践,并主要在MVC中编码php,但没有针对数据类型的自定义对象(用户信息等我主要存储在关联数组中)。我想把我在C#中学到的东西(基本上是制作结构或数据类,用来存储特定类型的数据,比如用户记录,或者说文章的信息)放到php中。这样,我就可以准确地知道期望的数据值(因为它们是定义的字段,而不仅仅是添加到数组中),从而允许在控制器和视图之间进行更多的抽象。
在php中,特别是在MVC设计模式中,有没有某种方法可以做到这一点?我很好奇应该把这些新的"数据类型"的定义放在哪里。
还是我只是错误地思考了这个问题,有更好的方法可以做到?
编辑:我试图实现的C#示例:
class program1
{
public void main ()
{
Article randomArticle = getArticle (); //instead of returning an object array, it returns a defined data type with predefined fields, so I don't need to guess what's there and what isn't
Console.WriteLine(randomArticle.title);
Console.ReadLine();
}
public Article getArticle ()
{
return new Article("Sometitle", "SomeContent");
}
}
struct Article
{
public Title {get; private set;}
public Content {get; private set;}
public Article (string title, string content)
{
this.Title = title;
this.Content = content;
}
}
(idk,如果上面的内容真的会编译,但它为您提供了我在PHP中尝试做的事情的要点)
PHP没有任何您想要实现的逻辑。IMO,确保data-types
导致了一个验证领域。我想让你检查几个条款,这将给你所需的一切。
-
类型铸造/杂耍[此处文档]
铸造可能是阻止不必要输入的最快方法。允许的铸造有:
- (int),(integer)-强制转换为integer
- (bool),(boolean)-强制转换为boolean
- (float)、(double)、(real)-转换为float
- (string)-强制转换为字符串
- (array)-强制转换为数组
- (object)-强制转换为object
- (unset)-强制转换为NULL(PHP 5)
-
PHP过滤器
PHP有一个函数filter_var(http://www.php.net/manual/en/function.filter-var.php)将帮助您比较数据类型
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)); var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));
-
PHP内置()函数
php中有许多函数,可以帮助您检查数据类型
- is_array():检查数组
- is_integer():检查整数
- is_object():检查对象
- is_float():检查浮点数
- ctype_digit():检查整数
以及更多
-
Regex验证
你可以在互联网上找到很多关于这方面的资源。
其他资源
- http://net.tutsplus.com/tutorials/php/sanitize-and-validate-data-with-php-filters/
- http://www.phpro.org/tutorials/PHP-Type-Casting.html
更新
你上面的方法可能会变成这样的
public function Article($title, $content) {
if(is_string($title)) { $this -> title = $title; }
if(is_string($content)) { $this -> content = $content; }
}
在PHP中,您可以自由地编写自己的系统来实现MVC。不过,我建议不要自己动手,而是考虑使用现有的系统。我们php类型有一个巨大的生态圈,并且有着悠久的历史。根据一些观点,PHP比一个更年轻、发展更快的C#更成熟。它也更简单,这很好。不过,具体来说:我推荐CakePHP。Drupal更健壮。还有曾德。Zend的优势是从编辑器到服务器优化和安全的端到端解决方案。
p.s.c#更像mvvm
编辑:代码示例
class Article {
protected $_title;
protected $_content;
public function setTitle( $title ) {
$this->_title = $title;
}
public function setContent( $content ) {
$this->_content = $content;
}
public function getTitle() {
return $this->_title;
}
public function getContent() {
return $this->_content;
}
/* magic not advisable; a technically valid technique, though it can lead to problems
public function __get( $property ) {
switch( $property ) {
case 'title': return $this->_title; break;
case 'content': return $this->_content; break;
default: break;
}
}
*/
}