PHP 정적 클래스 기반 원죄 상세 설명
정적 클래스 란 무엇 입 니까?
정적 클래스 란 인 스 턴 스 없 이 대상 으로 직접 정적 방식 으로 호출 되 는 클래스 를 말한다.코드 는 다음 과 같 습 니 다.
<?php
class Math
{
public static function ceil($value)
{
return ceil($value);
}
public static function floor($value)
{
return floor($value);
}
}
?>
此时类所扮演的角色更像是命名空间,这或许是很多人喜欢使用静态类最直接的原因。
静态类的问题
本质上讲,静态类是面向过程的,因为通常它只是机械的把原本面向过程的代码集合到一起,虽然结果是以类的方式存在,但此时的类更像是一件皇帝的新衣,所以可以说静态类实际上是披着面向对象的壳儿,干着面向过程的事儿。
面向对象的设计原则之一:针对接口编程,而不是针对实现编程。这有什么不同?打个比方来说:抛开价格因素,你喜欢独立显卡的电脑还是集成显卡的电脑?我想绝大多数人会选择独立显卡。独立显卡可以看做是针对接口编程,而集成显卡就就可以看做是针对实现编程。如此说来针对实现编程的弊端就跃然纸上了:它丧失了变化的可能性。
下面杜撰一个文章管理系统的例子来具体说明一下:
<?php
class Article
{
public function save()
{
ArticleDAO::save();
}
}
?>
Article实现必要的领域逻辑,然后把数据持久化交给ArticleDAO去做,而ArticleDAO是一个静态类,就好像焊在主板上的集成显卡一样难以改变,假设我们为了测试代码可能需要Mock掉ArticleDAO的实现,但因为调用时使用的是静态类的名字,等同于已经绑定了具体的实现方式,Mock几乎不可能,当然,实际上有一些方法可以实现:
<?php
class Article
{
private static $dao = 'ArticleDAO';
public static funciton setDao($dao)
{
self::$dao = $dao;
}
public static function save()
{
$dao = self::$dao;
$dao::save();
}
}
?>
변수의 개입 이 있어 서 실행 할 때 어떤 정적 클래스 를 구체 적 으로 사용 할 지 설정 할 수 있 습 니 다.
<?php
Article::setDao('MockArticleDAO');
Article::save();
?>
이러한 실현 방식 은 Mock 의 문 제 를 해결 한 것 처럼 보이 지만 먼저 기 존의 코드 를 수정 하여 개폐 원칙 을 위반 하고 그 다음 에 정적 변 수 를 가 져 왔 습 니 다.정적 변 수 는 공 유 된 상태 이기 때문에 다른 코드 의 실행 을 방해 할 수 있 습 니 다.그래서 완벽 한 해결책 은 아니다.동적 언어의 특성 을 이용 하여 간단하게 require 하나의 서로 다른 종류의 정의 파일 을 통 해 Mock 을 실현 할 수 있 습 니 다.그러나 이렇게 하 는 것 도 단점 이 있 습 니 다.스 크 립 트 에서 여러 번 실현 방식 을 바 꿔 야 한다 고 생각 하지만 실제 적 으로 우 리 는 require 를 한 번 만 사용 할 수 있 습 니 다.그렇지 않 으 면 중복 정의 오류 가 발생 할 수 있 습 니 다.
대상 의 가치
정적 클래스 를 포기 하고 대상 을 사용 하려 면 글 관리 시스템 의 예 를 어떻게 실현 해 야 합 니까?코드 는 다음 과 같다.
<?php
class Article
{
private $dao;
public function __construct($dao = null)
{
if ($dao === null) {
$dao = new ArticleDAO();
}
$this->setDao($dao);
}
public function setDao($dao)
{
$this->dao = $dao;
}
public function save()
{
$this->dao->save();
}
}
?>
실제로 사람들 이 흔히 말 하 는의존 주입기술 을 사 용 했 고 구조 기 나 Setter 를 통 해 의존 하 는 대상 을 주입 했다.
<?php
$article = new Article(new MockArticleDAO());
$article->save();
?>
대상 은 자신의 상태 가 있 고 공유 상태 가 다른 코드 의 집행 을 방해 하 는 상황 이 발생 하지 않 는 다.…
물론 정태 류 는 좋 은 면 이 있다.예 를 들 어 무 상태의 도구 류 를 실현 하 는 데 적합 하지만 대부분 은 나의 주관적 인 경향 이 명확 하고 대상 을 많이 사용 하 며 정태 류 를 적 게 사용 하여 시스템 이 너무 일찍 경화 되 는 것 을 피한다.참고 로 정태 적 인 유형 이 대상 보다 빠르다 는 설 교 를 해 주 셨 으 면 좋 겠 습 니 다.감사합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.