@joyqi 在 infoq 的采访中提到:
在框架上来说我们在PHP里引入了Java中注入变量的概念,虽然不是完全相同,但也已经到了神似。实现起来其实很简单,只是几个PHP的小技巧,但是却解决了PHP项目中一个让人头疼的问题,就是模块的自由引用。
后面又有 @gaosboy 提到:
多场景要求不同的数据模型进行不同组合,而我们却不需要为这些场景分别定义数据结构,只需要在使用时直接调用,框架会在运行时注入数据。
没看懂,可以分享一下具体如何实现吗?谢谢。
回复内容:
@joyqi 在 infoq 的采访中提到:
在框架上来说我们在PHP里引入了Java中注入变量的概念,虽然不是完全相同,但也已经到了神似。实现起来其实很简单,只是几个PHP的小技巧,但是却解决了PHP项目中一个让人头疼的问题,就是模块的自由引用。
后面又有 @gaosboy 提到:
多场景要求不同的数据模型进行不同组合,而我们却不需要为这些场景分别定义数据结构,只需要在使用时直接调用,框架会在运行时注入数据。
没看懂,可以分享一下具体如何实现吗?谢谢。
其实吧,没有大家想象的这么复杂,Zend Framework以把简单的事情搞复杂而著称,其实类中的变量注入过程可以总结为如下过程
class A { private $myObject; public function setMyObject($myObject) { $this->myObject = $myObject; } } $a = new A(); $a->setMyObject(new Object());
一句话说就是将一个外部对象引入作为类的内部属性,只不过我在框架设计时不想绕这么多弯,在java中是通过反射机制探测要注入的对象,所以你得写一堆set方法,因为java是常驻内存的,所以第一次注入时慢一点无所谓,但是如果php也这么搞效率就太低了。所以我反其道而行之,不需要让一个class来声明外部要注入什么变量,只需要知道我要用哪些变量就行了,其具体技巧在于__get
这个magic method里
class Base { public __get($varName) { $className = ucfirst($varName); $this->{$varName} = new $className; return $this->{$varName}; } }
这样,当我在继承自Base
的class里随便调用一个不存在的变量,比如$this->userModel
,它就会通过调用__get
方法,自动初始化new UserModel()
,并且将这个变量set到当前类的属性中,第二次调用就不必初始化了。
这只是个具体思路,具体的匹配和初始化规则会更复杂,而且你可能还需要实现单例模式,避免在不同的类中重复初始化相同的对象,不过这些都很简单了,最重要的就是这一步思路,说破了其实也很简单,相信很多朋友早已用过了。
应该是指依赖注入吧,参考Zf2的实现,非常完美,几乎考虑到了各种DI的场景
http://framework.zend.com/manual/2.0/...
源代码:
https://github.com/zendframework/zf2/...

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考虑使用AttActAcks.s.s.4)

会话再生是指在用户进行敏感操作时生成新会话ID并使旧ID失效,以防会话固定攻击。实现步骤包括:1.检测敏感操作,2.生成新会话ID,3.销毁旧会话ID,4.更新用户端会话信息。

PHP会话对应用性能有显着影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

phpientifiesauser'ssessionusessessionSessionCookiesAndSessionIds.1)whiwSession_start()被称为,phpgeneratesainiquesesesessionIdStoredInacookInAcookInamedInAcienamedphpsessidontheuser'sbrowser'sbrowser.2)thisIdAllowSphptptpptpptpptpptortoreTessessionDataAfromtheserverMtheserver。

PHP会话的安全可以通过以下措施实现:1.使用session_regenerate_id()在用户登录或重要操作时重新生成会话ID。2.通过HTTPS协议加密传输会话ID。3.使用session_save_path()指定安全目录存储会话数据,并正确设置权限。

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

记事本++7.3.1
好用且免费的代码编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6
视觉化网页开发工具