كيفية استدعاء دالة ديناميكيًا والتي تعد جزءًا من ملف cfc الذي تم إنشاء مثيل له، دون استخدام Evaluate()؟

StackOverflow https://stackoverflow.com/questions/84463

  •  01-07-2019
  •  | 
  •  

سؤال

على سبيل المثال، أريد أن أكون قادرًا على ضرب سطر من التعليمات البرمجية برمجيًا مثل ما يلي حيث يتم تعيين اسم الوظيفة ديناميكيًا دون استخدام Evaluate().الكود أدناه بالطبع لا يعمل ولكنه يمثل ما أود القيام به.

application.obj[funcName](argumentCollection=params)

الطريقة الوحيدة التي يمكنني العثور عليها لاستدعاء وظيفة ديناميكيًا هي استخدام cfinvoc، ولكن بقدر ما أستطيع أن أقول أن ذلك يؤدي إلى إنشاء مثيل لـ cfc/الوظيفة ذات الصلة بسرعة ولا يمكنه استخدام cfc الذي تم إنشاء مثيل له مسبقًا.

شكرًا

هل كانت مفيدة؟

المحلول

وفقًا للمستندات، يمكنك القيام بشيء مثل هذا:

<!--- Create the component instance. --->
<cfobject component="tellTime2" name="tellTimeObj">
<!--- Invoke the methods. --->
<cfinvoke component="#tellTimeObj#" method="getLocalTime" returnvariable="localTime">
<cfinvoke component="#tellTimeObj#" method="getUTCTime" returnvariable="UTCTime">

يجب أن تكون قادرًا على استدعائها ببساطة باستخدام الطريقة = "#myMethod#" لاستدعاء وظيفة معينة ديناميكيًا.

نصائح أخرى

يمكنك استخدام cfinvoc.ليس عليك تحديد مكون.

<cfinvoke method="application.#funcName#" argumentCollection="#params#">

يمكنك أيضًا القيام بشيء مشابه جدًا للطريقة التي تريد استخدامها بها.يمكنك الوصول إلى الطريقة داخل الكائن باستخدام الصيغة التي استخدمتها، لكن لا يمكنك استدعاؤها في نفس الوقت.ومع ذلك، إذا قمت بتعيينه إلى متغير مؤقت، فيمكنك الاتصال به

<!--- get the component (has methods 'sayHi' and a method 'sayHello') --->
<cfset myObj = createObject("component", "test_object")>

<!--- set the function that we want dynamically then call it (it's a two step process) --->
<cfset func = "sayHi">
<cfset funcInstance = myObj[func]>
<cfoutput>#funcInstance("Dave")#</cfoutput>

<cfset func = "sayHello">
<cfset funcInstance = myObj[func]>
<cfoutput>#funcInstance("Dave")#</cfoutput>

في CFML، تعتبر الوظائف أعضاء من الدرجة الأولى في اللغة.وهذا يسمح لنا بتمريرها كمتغير.في المثال التالي، سوف أقوم بنسخ الدالة المسماة 'foobar' وإعادة تسميتها إلى "$fn" داخل نفس الكائن.بعد ذلك، يمكننا ببساطة الاتصال بـ $fn().

funcName = 'foobar';    
application.obj.$fn = application.obj[funcName];
application.obj.$fn(argumentCollection=arguments);

يعد سياق الدالة مهمًا، خاصةً إذا كان يشير إلى أي قيم في نطاق "المتغيرات" أو "هذا" للكائن.ملحوظة:هذا ليس مؤشر ترابط آمن لمثيلات CFC في النطاقات المشتركة!

أسرع طريقة هي استخدام توصية Ben Doom.أردت فقط أن أكون شاملاً.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top