我有一个“简单框架”,其主要实例是 $app。现在,实现自动加载器的最佳方法是什么(不使用 Composer)。我需要的是有一个处理所有自动加载的类(支持各种命名空间)。我有一些方法/困境。
起初我想我应该创建一个处理所有事情的“静态”类。但后来我想到了一些事情。如果我在实例化 $app(包含所有路径)之前使用自动加载器,我需要在 $app 之外定义路径。而且,如果在自动加载类时发生错误,我将无法正确处理错误(错误处理程序在 $app 内,并在之后实例化)。
然后我想到了依赖注入(inject),使自动加载器成为应用程序内的一个对象。这将解决错误处理问题,并且不需要我对路径进行硬编码或使它们成为全局变量。但在实例化自动加载器之前,我也必须加载许多类(包括 $app)。
但我真的因为这个问题而陷入痛苦的世界,我真的不知道从哪里开始,有什么我应该考虑的建议吗?你能解释一下我应该使用哪种方法,为什么?
谢谢。
最佳答案
由于我在这些问题中得到的提示,我进行了更多搜索,并从哪里找到了很好的学习资源。
什么是自动加载?
自动加载基本上是程序找到未知类名并尝试在未定义类名的情况下加载它的过程。如果没有自动加载器,这种行为会导致 fatal error (至少对于 PHP)。使用自动加载器,事情发生了变化,程序将尝试加载类名,但不知道在哪里可以找到它,但是依赖于为此目的而考虑的函数或类,这些函数/类被称为 自动装弹机 .
__autoload() 与 spl_autoload_register()
在 PHP 中,我们有两种不同的方式来实现自动加载(您可能会发现从 PHP's site 中阅读它很有用。)。第一个是旧的__autoload() ,最新的是spl_autoload_register() .但究竟有什么区别呢?基本上 __autoload() 是独一无二的,拥有多个 Autoloader 会给您带来很多麻烦,并且会让您解决使用最新的 spl_autoload_* 函数可以轻松避免的问题。 spl_autoload_register() 另一方面,允许程序通过将它们放在一个堆栈中来拥有多个自动加载器,这样整个系统变得更加灵活且复杂得多(具有用于不同目的的单个自动加载器会导致具有处理许多请求的大型独特功能,这样你的代码可维护性和可重用性就会降低)。
警告:使用 spl_autoload_register() 会覆盖 __autoload(),所以要小心。
编码标准(在 PHP 中):PSR-0 与 PSR-4
让我们先说 PSR-4较新,它被认为是对 PSR-0 的改进,但不是强制性的,您必须使用 4 而不是 0,如标准 (PSR-4) 所述:
It is fully interoperable, and can be used in addition to any other autoloading specification, including PSR-0.
\vendor\(sub_namespaces\)class_name
path/to/project/vendor/sub/namespaces/class/name.php
\YourDeveloper\YourLibrary\YourFunction
/path/to/project/YourDeveloper/YourLibrary/YourFunction
/path/to/project/vendor/vendor_name
/path/to/project/vendor/YourDeveloper/src/YourDeveloper/YourLibrary/YourFunction
/path/to/project/vendor/YourDeveloper/YourLibrary/YourFunction
关于PHP 类自动加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23312688/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
我需要做这样的事情classUser'User',:foreign_key=>'abuser_id'belongs_to:gameendclassGame['JOINabuse_reportsONusers.id=abuse_reports.abuser_id','JOINgamesONgames.id=abuse_reports.game_id'],:group=>'users.id',:select=>'users.*,count(distinctgames.id)ASgame_count,count(abuse_reports.id)asabuse_report_count',:
我指的是pubrailscasttutorial并已正确执行所有步骤,但在运行最后一个命令时,即rackupprivate_pub.ru-sthin-Eproduction为了架设faye服务器,我收到以下错误:/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in`require':cannotloadsuchfile--thin(LoadError)from/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in`require'from/var/lib/gems/1.9.1/gems