Yii2框架의 几个隐蔽적坑
摘要:Yii2是一款优秀의 통용 웹后端框架,结构简单优雅, 实用功能丰富, 扩展性强, 性能搞是他最突aturate优点.赘述。而这些隐蔽的小瑕疵,显得更有必要告诉대가족。
- 블로그: http://www.cnblogs.com/jhzhu
- 이메일: jhzhuustc@gmail.com
- 저자: Zhimingso
- 시간: 2015-08-17
목차
- Yii2 프레임워크의 숨겨진 함정
- 목차 목차
- 가십 얘기
- ActiveRecord가 설명할 수 없이 작성되었다고요?
- 지식 준비
- 코드 장면
- 문제 요약
- 해결 방법
- 거래가 적용되었나요? ?
- 코드씬
- 문제요약
- 해결방법
- 'Y-m-d'가 인식되지 않나요?
- 코드 장면
- 문제 요약
가십 이야기
거리 마지막으로 블로그를 운영한지 3개월이 지났습니다. 글을 쓰기 전에는 늘 깊은 죄책감을 느낍니다. 나는 오랫동안 이것에 시달린 끝에 마침내 조치를 취했습니다.
축하할 만한 일 중 하나: 최근에는 매일 아침 8시 30분에 일어나 운동을 시작했습니다. 매우 유용하고 단 8분밖에 걸리지 않는 두 개의 비디오가 있습니다. 그냥 따라하시면 여러분이 행복해지겠지만 폭발하지는 않을 것이라고 장담합니다. (8분 복근 운동 레벨 2 - 다운로드, 8분 가슴 근육 운동 레벨 2 - 다운로드)
생각해 볼 만한 한 가지: 최근에 "쇼펜하우어의 미학에 관한 에세이"를 읽었고 그것이 제 인생을 바꿔 놓았습니다. 독서에 대한 견해. 나는 독서가 발전의 원천이라고 생각했는데, 이 책을 읽고 뺨을 크게 맞았습니다. 자, 한 단락을 공유하겠습니다.
우리가 보는 외부 환경은 독서 자료처럼 우리 마음에 특정 의견을 강요하지 않는 한, 우리에게 자료와 기회만 제공할 뿐입니다. 우리의 정신적 능력에 비례하고 현재의 감정과 일치하는 것을 생각하는 것입니다. 그러므로 너무 많이 읽으면 용수철에 무거운 물건을 계속 눌렀을 때 용수철이 탄력을 잃게 되는 것처럼 우리의 정신은 탄력성을 잃게 됩니다. 자유로운 순간, 바로 책을 집으세요.
생각이 발전의 원천입니다!
자, 말도 안되는 소리는 그만하고 본론으로 들어가겠습니다.
ActiveRecord가 설명할 수 없이 작성되었나요?
지식의 기본 사용법을 준비하세요
-
ActiveRecord
. 이해가 안 되시면 여기를 참고하시면 됩니다.
코드 장면
<span>/**</span><span> * @property integer $id</span><span> * @property string $name</span><span> * @property string $detail</span><span> * @property double $price</span><span> * @property integer $area</span><span> **/</span><span>class OcRoom extends ActivieRecord</span><span>{</span><span> ...</span><span>}</span><span>$room = OcRoom::find() //先取出一个对象。</span><span> ->select(['id']) //只取出'id'列</span><span> ->where(['id'=>20])</span><span> ->one();</span><span>$room->save(); //保存,会发现此行的其它字段都被写成默认值了。</span>
문제 요약
이 예제의 문제점은 다음과 같습니다.
- I 데이터베이스에서 한 행을 꺼냈는데, 이는 코드의
$room
인데id
필드만 빼고 나머지 필드는 당연히 기본값입니다. -
$room->save()
할 때 기본값이 있는 해당 필드도 데이터베이스에 저장되었습니다. 뭐!? - 즉, 리소스를 저장하고 모든 필드를 제거하지 않으려는 경우 저장하지 않도록 주의해야 합니다. 그렇지 않으면 많은 데이터가 설명할 수 없을 정도로 기본값으로 수정됩니다.
해결책
그런데 우리가 가지고 있는 해결책은 무엇입니까? 여러 가지 아이디어 제공:
- 완전히 꺼내지 않은
ActiveRecord
을 저장하지 않도록 항상 주의하세요. - 은
ActiveRecord
을 수정하거나 상속하므로 이 객체가find()
에 의해 생성되고 필드가 완전히 제거되지 않은 경우save()
메서드가 호출되고 예외가 발생합니다. - 은
ActiveRecord
에 의해 이 객체가 생성되고 필드가 완전히 추출되지 않은 경우find()
메서드 호출 시 추출된 필드만 저장되고 다른 필드는 추출되도록save()
을 수정하거나 상속합니다. 무시되었습니다.
거래가 적용되었나요?
코드 장면
<span>/**</span><span> * @property integer $id</span><span> * @property string $name</span><span> **/</span><span>class OcRoom extends ActiveRecord</span><span>{</span><span> public function rules()</span><span> {</span><span> return [['name','string','min'=>2,'max'=>10]];</span><span> }</span><span> ...</span><span>}</span><span>class OcHouse extends ActiveRecord</span><span>{</span><span> public function rules()</span><span> {</span><span> return [['name','string','max'=>10]];</span><span> }</span><span> ...</span><span>}</span><span>$a = new OcRoom();</span><span>$a->name = ''; //name为空字符串,不满足rules()条件。</span><span>$b = new OcHouse();</span><span>$b->name = '我的房间'; //name合法,可以保存。</span><span>$transaction = Yii::$app->db->beginTransaction();</span><span>try{</span><span> $a->save(); //name字段不合法,无法验证通过,在validate()阶段已经返回false,不会进行数据库存储的步骤,所以也不会抛出异常。</span><span> $b->save(); //name字段合法,可以正常保存。</span><span> $transaction->commit(); //提交后,发现$a保存失败,而$b保存成功。</span><span>}</span><span>catch (Exception $e) </span><span>{</span><span> Yii::error($e->getTraceAsString(),__METHOD__);</span><span> $transaction->rollBack();</span><span>}</span>
문제 요약
이 코드의 문제는 다음과 같습니다.
- 모두가 알고 있습니다
$transaction
의 목적은 전체 데이터베이스 저장 코드가 성공하거나 실패하는지 확인하는 것입니다. - 분명히 이 예에서
transaction
는 우리가 원하는 효과를 얻지 못합니다.$a
validate()
이 전달되지 않았기 때문에$transation->commit()
이 전달되면 오류가 보고되지 않습니다.
해결 방법
$transation
블록에서는 모든 save()
이 반환 값을 결정해야 합니다. false
이면 예외가 직접 발생합니다.
'Y-m-d'가 인식되지 않나요?
코드 장면
<span>OcRenterBill extends ActiveRecord</span><span>{</span><span> public function rules()</span><span> {</span><span> return [</span><span> ['start_time','date','format'=>'Y-m-d'],</span><span> ];</span><span> }</span><span>}</span><span>$a = new OcRenterBill();</span><span>$a = '2015-09-12';</span><span>$a->save(); //会报错,说格式不对。</span>
문제 요약
Yii 프레임워크가 처음에 오류를 보고하는 경우 이는 함정으로 간주되지 않습니다. 문제는 Mac에서 개발할 때는 완전히 정상적으로 작동하는데, 온라인 환경(Ubuntu)에 퍼블리시하고 나면 "start_time 속성 형식이 잘못되었습니다."라는 오류가 뜹니다. 공식 문서를 참고해 보니 공식 문서에서는 이 형식이 허용되는 것으로 나타났습니다.
아아아. 여러 시행착오 끝에 php:Y-m-d
로 바꾸면 세상이 더 깨끗해질 것이라는 걸 깨달았습니다. 따라서 이 문제가 발생하면 저에게 감사드립니다.

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

섬유는 PHP8.1에 도입되어 동시 처리 기능을 향상시켰다. 1) 섬유는 코 루틴과 유사한 가벼운 동시성 모델입니다. 2) 개발자는 작업의 실행 흐름을 수동으로 제어 할 수 있으며 I/O 집약적 작업을 처리하는 데 적합합니다. 3) 섬유를 사용하면보다 효율적이고 반응이 좋은 코드를 작성할 수 있습니다.

PHP 커뮤니티는 개발자 성장을 돕기 위해 풍부한 자원과 지원을 제공합니다. 1) 자료에는 공식 문서, 튜토리얼, 블로그 및 Laravel 및 Symfony와 같은 오픈 소스 프로젝트가 포함됩니다. 2) 지원은 StackoverFlow, Reddit 및 Slack 채널을 통해 얻을 수 있습니다. 3) RFC에 따라 개발 동향을 배울 수 있습니다. 4) 적극적인 참여, 코드에 대한 기여 및 학습 공유를 통해 커뮤니티에 통합 될 수 있습니다.

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경
