Req #62519 [Opn->Wfx]: Find out about a function's call context

From: Date: Mon, 27 Sep 2021 13:30:37 +0000
Subject: Req #62519 [Opn->Wfx]: Find out about a function's call context
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-236860@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=62519&edit=1 ID: 62519 Updated by: cmb@php.net Reported by: awilliams at linkme dot com dot au Summary: Find out about a function's call context -Status: Open +Status: Wont fix Type: Feature/Change Request Package: Unknown/Other Function Operating System: any PHP Version: Irrelevant -Assigned To: +Assigned To: cmb Block user comment: N Private report: N New Comment: > Many people would say that changing the behavior of a function > from it's use case is bad. That. Still, users can write such functions if they which (and PHP itself has var_export() and maybe others), but we should not endorse this by adding "automatic" support. Therefore, I'm closing as WONTFIX. If anyone still wants to have this feature, please pursue the RFC process[1]. [1] <https://wiki.php.net/rfc/howto> Previous Comments: ------------------------------------------------------------------------ [2012-10-26 19:11:46] j_holland at hotmail dot com The reason to expose the calling context is so that the function can confirm it's correct: function calculate_something($args){ if (get_calling_context() == "VOID") { print "ERROR: must be called in non-void context!"; exit; } return do_expensive_calculation($args); } This might be unnecessary in your own code but it's VERY useful when writing libraries. Perl has this function (wantarray) and I use it whenever I write libraries. Yes, this function can be misused, but so can most functions. Overloading the return keyword is a terrible way to implement this. Make it a clearly named function, like get_calling_context. Finally, it would probably be sufficient to simply return void/non-void context, but more specific context is known: print function(); // the RV will be evaluated as a string $a = 3 + function(); // the RV will be treated as a number if (function())); // the RV will be treated as a Boolean etc. ------------------------------------------------------------------------ [2012-07-12 01:51:00] johannes@php.net You could pass an additional parameter to the function function ($foo, $return) { if ($return) { return $foo; } else { echo $foo; } } Many people would say that changing the behavior of a function from it's use case is bad. I'm also not sure we can implement this without adding overhead to *all* function calls, which we won't like to do. ------------------------------------------------------------------------ [2012-07-11 11:31:07] awilliams at linkme dot com dot au I would like to present a more concrete example of why I think this would be an elegant solution to a coding dilemma I have. I wrote a couple of functions to generate html for <select> mark-up from mySql tables and php arrays. Some times I want to call them directly and I want then to output the html, other times I want to use them in string expressions, in which case I want them to return the html. As it stands I would have to do this using different function names, which looks messy. To implement this I have two choices, maintain two separate functions doing almost the same thing. That is never best practice. Sooner or later you forget to do a change to both of them. Declare the string returning function and call it from the string printing version. This is wasteful of stack and call time resources, I try not to code like that. I am left looking at this thinking it would be a really elegant solution if the function its self could tell what context it was called in and either echo or return the output as required. I agree that it’s a somewhat unconventional suggestion. I wouldn't expect it of 'C'. I write in PHP because many things are simpler an more flexible here, and this would definitely add a new form of flexibility that I have a use for. Thank you and that's my last word on it. Alan ------------------------------------------------------------------------ [2012-07-10 14:01:11] nikic@php.net PHP is a dynamically typed language. It can't in the general case know what type is expected. Simple example if f1() + f2(). Here int, float and array would be viable return types. Whether the return value is used or not is known to the engine and also exposed to internal functions. But I don't think that it makes sense to expose it to userland functions. Functions shouldn't behave different based on whether the return value is used or not. ------------------------------------------------------------------------ [2012-07-10 04:10:55] awilliams at linkme dot com dot au Description: ------------ I would like to be able to tell if a function was called from a context that is expecting a return value or not. Additionally what type is expected. eg('hello'); // called not expecting a return value echo eg('hello').' world'; // called expecting a string function eg($s) { if(return){ // suggested overloading of the return keyword to report the function context. return ($s); } else{ echo $s; } } Additionally gettype(return); and is_string(return); is_array(return); etc ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=62519&edit=1

« previous php.bugs (#236860) next »