» Javascript equivalent for PHP's echo
399 PHP equivalents
- PHP.JS Licensing
- PHP.JS SVN
- PHP.JS Namespaced
- abs
- acosh
- acos
- addslashes
- aggregate
- aggregate_info
- aggregate_methods
- aggregate_methods_by_list
- aggregate_methods_by_regexp
- aggregate_properties
- aggregate_properties_by_list
- aggregate_properties_by_regexp
- aggregation_info
- array
- array_change_key_case
- array_chunk
- array_combine
- array_count_values
- array_diff
- array_diff_assoc
- array_diff_key
- array_diff_uassoc
- array_diff_ukey
- array_fill
- array_fill_keys
- array_filter
- array_flip
- array_intersect
- array_intersect_assoc
- array_intersect_key
- array_intersect_uassoc
- array_intersect_ukey
- array_keys
- array_key_exists
- array_map
- array_merge
- array_merge_recursive
- array_multisort
- array_pad
- array_pop
- array_product
- array_push
- array_rand
- array_reduce
- array_reverse
- array_search
- array_shift
- array_slice
- array_splice
- array_sum
- array_udiff
- array_udiff_assoc
- array_udiff_uassoc
- array_uintersect
- array_uintersect_assoc
- array_uintersect_uassoc
- array_unique
- array_unshift
- array_values
- array_walk
- array_walk_recursive
- arsort
- asinh
- asin
- asort
- assert
- assert_options
- atan2
- atanh
- atan
- base64_decode
- base64_encode
- basename
- base_convert
- bin2hex
- bindec
- call_user_func
- call_user_func_array
- ceil
- checkdate
- chop
- chr
- chunk_split
- classkit_import
- classkit_method_add
- classkit_method_copy
- classkit_method_redefine
- classkit_method_remove
- classkit_method_rename
- class_exists
- compact
- constant
- convert_uuencode
- cosh
- cos
- count
- count_chars
- crc32
- create_function
- ctype_alnum
- ctype_alpha
- ctype_cntrl
- ctype_digit
- ctype_graph
- ctype_lower
- ctype_print
- ctype_punct
- ctype_space
- ctype_upper
- ctype_xdigit
- current
- date
- date_default_timezone_get
- date_default_timezone_set
- date_parse
- deaggregate
- decbin
- dechex
- decoct
- defined
- define
- deg2rad
- die
- dirname
- doubleval
- each
- » echo
- empty
- end
- exit
- explode
- expm1
- exp
- extract
- fclose
- feof
- fgetcsv
- fgetc
- fgetss
- fgets
- filemtime
- filesize
- file
- file_exists
- file_get_contents
- floatval
- floor
- fmod
- fopen
- fpassthru
- fread
- fseek
- ftell
- function_exists
- func_get_args
- func_get_arg
- func_num_args
- getdate
- getenv
- getlastmod
- getrandmax
- gettimeofday
- gettype
- get_cfg_var
- get_class
- get_class_methods
- get_class_vars
- get_declared_classes
- get_defined_constants
- get_defined_functions
- get_defined_vars
- get_headers
- get_html_translation_table
- get_included_files
- get_meta_tags
- get_object_vars
- get_required_files
- get_resource_type
- gmdate
- gmmktime
- gmstrftime
- gopher_parsedir
- hexdec
- htmlentities
- htmlspecialchars
- htmlspecialchars_decode
- html_entity_decode
- http_build_query
- hypot
- idate
- implode
- import_request_variables
- include
- include_once
- ini_alter
- ini_get
- ini_get_all
- ini_restore
- ini_set
- intval
- in_array
- ip2long
- isset
- is_array
- is_binary
- is_bool
- is_buffer
- is_callable
- is_double
- is_finite
- is_float
- is_infinite
- is_integer
- is_int
- is_long
- is_nan
- is_null
- is_numeric
- is_object
- is_real
- is_resource
- is_scalar
- is_string
- is_unicode
- join
- json_decode
- json_encode
- key
- krsort
- ksort
- lcfirst
- lcg_value
- levenshtein
- localeconv
- localtime
- log10
- log1p
- log
- long2ip
- ltrim
- max
- md5
- md5_file
- method_exists
- microtime
- min
- mktime
- mt_getrandmax
- mt_rand
- natcasesort
- natsort
- next
- nl2br
- nl_langinfo
- number_format
- octdec
- ord
- parse_str
- parse_url
- pathinfo
- pclose
- phpversion
- php_ini_loaded_file
- php_ini_scanned_files
- php_strip_whitespace
- pi
- popen
- pos
- pow
- preg_grep
- preg_quote
- prev
- printf
- print_r
- property_exists
- putenv
- quoted_printable_decode
- quoted_printable_encode
- quotemeta
- rad2deg
- rand
- range
- rawurldecode
- rawurlencode
- readfile
- realpath
- register_shutdown_function
- require
- require_once
- reset
- restore_exception_handler
- rewind
- round
- rsort
- rtrim
- runkit_class_adopt
- runkit_class_emancipate
- runkit_function_add
- runkit_function_copy
- runkit_function_redefine
- runkit_function_remove
- runkit_function_rename
- runkit_import
- runkit_method_add
- runkit_method_copy
- runkit_method_redefine
- runkit_method_remove
- runkit_method_rename
- runkit_superglobals
- serialize
- setcookie
- setlocale
- setrawcookie
- settype
- set_exception_handler
- set_time_limit
- sha1
- sha1_file
- shuffle
- sinh
- sin
- sizeof
- sleep
- sort
- soundex
- split
- sprintf
- sql_regcase
- sqrt
- strcasecmp
- strchr
- strcmp
- strcoll
- strcspn
- strftime
- stripos
- stripslashes
- strip_tags
- stristr
- strlen
- strnatcasecmp
- strnatcmp
- strncasecmp
- strncmp
- strpbrk
- strpos
- strrchr
- strrev
- strripos
- strrpos
- strspn
- strstr
- strtok
- strtolower
- strtotime
- strtoupper
- strtr
- strval
- str_getcsv
- str_ireplace
- str_pad
- str_repeat
- str_replace
- str_rot13
- str_shuffle
- str_split
- str_word_count
- substr
- substr_compare
- substr_count
- substr_replace
- tanh
- tan
- timezone_abbreviations_list
- timezone_identifiers_list
- time
- time_nanosleep
- time_sleep_until
- trim
- uasort
- ucfirst
- ucwords
- uksort
- uniqid
- unserialize
- urldecode
- urlencode
- usleep
- usort
- utf8_decode
- utf8_encode
- var_dump
- var_export
- vprintf
- vsprintf
- wordwrap
PHP to Javascript Project: php.js
This article is part of the 'Porting PHP to Javascript' Project, which aims to decrease the gap between developing for PHP & Javascript.
A lot of people are familiar with PHP's functions, and though Javascript functions are often quite similar, some functions may be missing or addressed differently. The Javascript implementations should be as compliant with the PHP versions as possible, a good indication is that the PHP function manual could also apply to the Javascript version.
Porting crucial PHP functions to Javascript can be fun & useful. Currently some PHP functions have been added, but readers are encouraged to contribute and improve functions by adding comments. Eventually the goal is to save all the functions in one php.js file and make it publicly available for your coding pleasure.
If you choose to contribute, let me know how you want to be credited in the function's comments. You may also want to subscribe to RSS so you receive updates whenever new functions are posted.
This is a Javascript version of the PHP function: echo.
I have moved out PHP.JS to it's own site. For info & reactions on comments please goto phpjs.org
PHP echo
Description
echo - Output one or more strings
void echo( string arg1 [, string ...] )
echo() is not actually a function (it is a language construct), so you are not required to use parentheses with it. echo() (unlike some other language constructs) does not behave like a function, so it cannot always be used in the context of a function. Additionally, if you want to pass more than one parameter to echo(), the parameters must not be enclosed within parentheses.
Parameters
-
arg1
The parameter to output.
Return Values
No value is returned.
See Also
Javascript echo
Source
This is the main source of the Javascript version of PHP's echo
function echo ( ) { // http://kevin.vanzonneveld.net // + original by: Philip Peterson // + improved by: echo is bad // + improved by: Nate // + revised by: Der Simon (http://innerdom.sourceforge.net/) // + improved by: Brett Zamir (http://brett-zamir.me) // + bugfixed by: Eugene Bulkin (http://doubleaw.com/) // + input by: JB // + improved by: Brett Zamir (http://brett-zamir.me) // % note 1: If browsers start to support DOM Level 3 Load and Save (parsing/serializing), // % note 1: we wouldn't need any such long code (even most of the code below). See // % note 1: link below for a cross-browser implementation in JavaScript. HTML5 might // % note 1: possibly support DOMParser, but that is not presently a standard. // % note 2: Although innerHTML is widely used and may become standard as of HTML5, it is also not ideal for // % note 2: use with a temporary holder before appending to the DOM (as is our last resort below), // % note 2: since it may not work in an XML context // % note 3: Using innerHTML to directly add to the BODY is very dangerous because it will // % note 3: break all pre-existing references to HTMLElements. // * example 1: echo('<div><p>abc</p><p>abc</p></div>'); // * returns 1: undefined var arg = '', argc = arguments.length, argv = arguments, i = 0; var win = this.window; var d = win.document; var ns_xhtml = 'http://www.w3.org/1999/xhtml'; var ns_xul = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'; // If we're in a XUL context var holder; var stringToDOM = function (str, parent, ns, container) { var extraNSs = ''; if (ns === ns_xul) { extraNSs = ' xmlns:html="'+ns_xhtml+'"'; } var stringContainer = '<'+container+' xmlns="'+ns+'"'+extraNSs+'>'+str+'</'+container+'>'; if (win.DOMImplementationLS && win.DOMImplementationLS.createLSInput && win.DOMImplementationLS.createLSParser) { // Follows the DOM 3 Load and Save standard, but not // implemented in browsers at present; HTML5 is to standardize on innerHTML, but not for XML (though // possibly will also standardize with DOMParser); in the meantime, to ensure fullest browser support, could // attach http://svn2.assembla.com/svn/brettz9/DOMToString/DOM3.js (see http://svn2.assembla.com/svn/brettz9/DOMToString/DOM3.xhtml for a simple test file) var lsInput = DOMImplementationLS.createLSInput(); // If we're in XHTML, we'll try to allow the XHTML namespace to be available by default lsInput.stringData = stringContainer; var lsParser = DOMImplementationLS.createLSParser(1, null); // synchronous, no schema type return lsParser.parse(lsInput).firstChild; } else if (win.DOMParser) { // If we're in XHTML, we'll try to allow the XHTML namespace to be available by default return new DOMParser().parseFromString(stringContainer, 'text/xml').documentElement.firstChild; } else if (win.ActiveXObject) { // We don't bother with a holder in Explorer as it doesn't support namespaces var d = new ActiveXObject('MSXML2.DOMDocument'); d.loadXML(str); return d.documentElement; } /*else if (win.XMLHttpRequest) { // Supposed to work in older Safari var req = new win.XMLHttpRequest; req.open('GET', 'data:application/xml;charset=utf-8,'+encodeURIComponent(str), false); if (req.overrideMimeType) { req.overrideMimeType('application/xml'); } req.send(null); return req.responseXML; }*/ else { // Document fragment did not work with innerHTML, so we create a temporary element holder // If we're in XHTML, we'll try to allow the XHTML namespace to be available by default //if (d.createElementNS && (d.contentType && d.contentType !== 'text/html')) { // Don't create namespaced elements if we're being served as HTML (currently only Mozilla supports this detection in true XHTML-supporting browsers, but Safari and Opera should work with the above DOMParser anyways, and IE doesn't support createElementNS anyways) if (d.createElementNS && // Browser supports the method d.documentElement.namespaceURI && (d.documentElement.namespaceURI !== null || // We can use if the document is using a namespace d.documentElement.nodeName.toLowerCase() !== 'html' || // We know it's not HTML4 or less, if the tag is not HTML (even if the root namespace is null) (d.contentType && d.contentType !== 'text/html') // We know it's not regular HTML4 or less if this is Mozilla (only browser supporting the attribute) and the content type is something other than text/html; other HTML5 roots (like svg) still have a namespace )) { // Don't create namespaced elements if we're being served as HTML (currently only Mozilla supports this detection in true XHTML-supporting browsers, but Safari and Opera should work with the above DOMParser anyways, and IE doesn't support createElementNS anyways); last test is for the sake of being in a pure XML document holder = d.createElementNS(ns, container); } else { holder = d.createElement(container); // Document fragment did not work with innerHTML } holder.innerHTML = str; while (holder.firstChild) { parent.appendChild(holder.firstChild); } return false; } // throw 'Your browser does not support DOM parsing as required by echo()'; }; var ieFix = function (node) { if (node.nodeType === 1) { var newNode = d.createElement(node.nodeName); var i, len; if (node.attributes && node.attributes.length > 0) { for (i = 0, len = node.attributes.length; i < len; i++) { newNode.setAttribute(node.attributes[i].nodeName, node.getAttribute(node.attributes[i].nodeName)); } } if (node.childNodes && node.childNodes.length > 0) { for (i = 0, len = node.childNodes.length; i < len; i++) { newNode.appendChild(ieFix(node.childNodes[i])); } } return newNode; } else { return d.createTextNode(node.nodeValue); } }; for (i = 0; i < argc; i++ ) { arg = argv[i]; if (this.php_js && this.php_js.ini && this.php_js.ini['phpjs.echo_embedded_vars']) { arg = arg.replace(/(.?)\{\$(.*?)\}/g, function (s, m1, m2) { // We assume for now that embedded variables do not have dollar sign; to add a dollar sign, you currently must use {$$var} (We might change this, however.) // Doesn't cover all cases yet: see http://php.net/manual/en/language.types.string.php#language.types.string.syntax.double if (m1 !== '\\') { return m1+eval(m2); } else { return s; } }); } if (d.appendChild) { if (d.body) { if (win.navigator.appName == 'Microsoft Internet Explorer') { // We unfortunately cannot use feature detection, since this is an IE bug with cloneNode nodes being appended d.body.appendChild(ieFix(stringToDOM(arg))); } else { var unappendedLeft = stringToDOM(arg, d.body, ns_xhtml, 'div').cloneNode(true); // We will not actually append the div tag (just using for providing XHTML namespace by default) if (unappendedLeft) { d.body.appendChild(unappendedLeft); } } } else { d.documentElement.appendChild(stringToDOM(arg, d.documentElement, ns_xul, 'description')); // We will not actually append the description tag (just using for providing XUL namespace by default) } } else if (d.write) { d.write(arg); }/* else { // This could recurse if we ever add print! print(arg); }*/ } }
Examples
Currently there is 1 example
Example 1
echo('Hello', 'World');And that would return
undefined
More about this Project
Download php.js
To easily include it in your code, every function currently available is stored in
Normal
- uncompressed source: php.js
- minified: php.min.js [recommended]
- compressed: php.packed.js
Namespaced What is 'namespaced?'
- uncompressed source: php.namespaced.js
- minified: php.namespaced.min.js
- compressed: php.namespaced.packed.js
To download use Right click, Save Link As
Generally the best way is to use a minified version and gzip it
Credits
Respect & awards go to everybody who has contributed in some way so far:
Your name here?
Contributing is as easy as adding a comment with better code, or code for a new function.
Any contribution leading to improvement will directly get your name & link here.
Coming Project features
Project features that we are currently working on:
- Done - Site. A place for php.js of it's own. See: phpjs.org.
- Done - Compile. Compile your own php.js version, with only the functions you need. Should generate a hash with which you can retrieve latest versions of your php.js combination. Done - Testsuite. A better test-suite that can be ran locally so developers can easily test before commiting. Also the testing itself should be more thorough.
- Done - Versioning. Individual functions are versioned, but the entire library should be versioned as well.
Stay up to date
You can track my blog
articles and
comments. You may also find my
bookmarks interesting. Or
Follow me on Twitter
Like this article?
|
Then Dzone it! Or use another bookmark button below to show your support & help me spread the word. |
RelatedArticles like this one» PHP.JS Licensing |
tags: programming, php, javascript, phpjs
category: Programming - Javascript - PHP equivalents
read: 11,728 times
Add Comment
PHP.JS is outgroing this blog and moving to it's own space. Please leave your comment here: http://phpjs.org/functions/echo










tagcloud

#20. Kevin on 25 January 2009
#19. Brett Zamir on 18 January 2009
By the way, maybe the function could also test
if (document.body) {
... [more] document.body.appendChild(stringToDOM(arg));
}
else {
document.documentElement.appendChild(stringToDOM(arg));
}
to see if there IS a document.body, in case we are in an XML context (like XUL), and if not, append after the last element in the document.
As far as the speed, in my crude tests just now in JavaScript, there seems to be no difference in JavaScript between returning with null and not returning anything. But in PHP there is apparently a slight difference according to the FAQ linked from the PHP documentation: http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40 , and the behavior of echo is not to return anything (while print returns 1), so I think there's no reason to return null specifically (takes a little more space in the already big function!) :)
As far as implementing the DOM functions, you're right, there is no place I know of, except serialize() if it handles DOM objects, and DOMDocument::saveXML, DOMDocument::loadXML . (speaking of the DOM in PHP (as in DOMDocument::validate), I'd LOVE to get XML validation in JS somehow).
But the note about the DOM functions was otherwise more just of an interesting aside (if you don't mind my overloading the comments here!).
#18. Kevin on 17 January 2009
out buffering is a great idea. we should first make all functions that print something rely on echo,
and have echo collect a buffer. i can see this working.
... [more] does that really effect the speed, yes?
notes removed.
I don't see yet where else we we should implement those dom functions. I have to say I don't work with that stuff on a daily basis.
#17. Brett Zamir on 17 January 2009
to
#16. Brett Zamir on 17 January 2009
needs to be changed to:
Now...print() would be the same with the following differences:
This line at the top:
can be entirely removed in print(). print() should also have "arg" added as an explicit function parameter (unless you want to merge the functions--see below).
To get the marginal speed difference with echo, you don't even need the line "return null" because functions always return undefined when not specified (which is probably a little closer to the PHP behavior if we get picky).
The for loop at the end can be replaced with the following shorter version if you are making an independent version for print():
Note that if you did decide to have print() call echo() and just let its single argument cycle through the for loop one time, you'd have to still:
1) avoid potential recursion by avoiding the print(arg) call (as I did above for a dedicated version of print())
2) return 1 instead of not returning anything
Also, you can remove the notes to this function now (and for print()).
By the way, I realized that the stringToDOM() function can be stripped down a tiny bit more by changing substr() references to slice() (same behavior with one argument)--and substring() calls could be changed to slice() in cases where the 2nd argument would never be negative, though that would be harder to gauge without going through the code.
After going through the stringToDOM() code a little more, besides the shortening just mentioned, I realized that a little bit more could be done, such as allow namespaces on elements and attributes when parsing to DOM. I'm not sure though when I may have time to get to it (have some deadlines now), but I hope to get to it eventually.
It would be cool if there could be some what we could specify where we wanted the echo to go (e.g., if we didn't want it in the body). You know, I think we should be able to actually implement the PHP output buffer functions by configuring a parameter (as in the global php_js) which allowed the output from such functions to be captured and aggregated (until flushed/cleaned) and then output later or assigned to a variable!
As an extended aside, another great thing about the stringToDOM() and DOMToString() functions is that they could be combined to make a standards-compliant version of the DOM level 3 Load-and-Save module for serialization and parsing (currently not supported in Firefox and probably other browsers).
For example, using the skeleton code within the source at https://bugzilla.mozilla.org/attachment.cgi?id=333875 (for Mozilla bug https://bugzilla.mozilla.org/show_bug.cgi?id=155749 ), they could be used within the code for LSSerializer.prototype.writeToString and LSParser.prototype.parse .
Thus you could parse in any browser in a compliant fashion with something like this:
and serialize in any browser with something like this:
Admittedly it might not be pretty, but it's standard (and can easily be wrapped as with the current Firefox and IE equivalents).
#15. Kevin on 16 January 2009
My main concern was that for such a little function, it would be a lot of code. There's no room in PHP.JS for global dependencies so it would really have to be duplicated inside the functions. So a really bloated echo would be the result.
I'm okay with it now because:
... [more] - Brett you did a great job trimming it down the the essentials that are important to us.
- I have actually gotten some work done on the public compiler, which will enable people to optionally include echo in their package.
Never ceases to amaze me. The simplest functions sometimes need the biggest chunks of code ;)
Anyway, great effort both.
PS. Can we alias print to echo?
#14. Brett Zamir on 15 January 2009
Although it is still somewhat large for the average PHP-JS function, with a few superficial tweaks to the already terse code (such as removing a couple document.all blocks), and by just using one of his functions (the only one needed by echo), we can get something as relatively small as this:
I suggest incorporating his useful and standards-compliant method (and also adding print() too), if you were still open to it...
(Maybe it would be even more standards compliant if it checked for createElementNS support, but using the function in XUL still works ok for me)
#13. der_simon on 15 January 2009
im the author of the innerDOM-Script and I'm happy that anyone really cares about my few lines of code. I'm way out of the programming business, so I can only partly partitiate.
What I couldn't see from my point is: Whould it help to contribiute the innerDOM-Script to your project or not? The php.js page says:
... [more]
“There's no good place for a package like http://innerdom.sourceforge.net/”
So if it would be helpful I'm willing to contribute my code.
Regard from Germany
Der Simon
#12. Kevin on 14 November 2008
- work
- not change php.js' standalone-lyness
- make echo a big function ;)
... [more] Thank you very much for sharing your thoughts and code on this with us. For now, I've at least comitted your changes.
#11. Nate on 13 November 2008
1. There is a misspelling. The code
Should read
2. After
you need the line
I tested it with Firefox, IE, Opera, and Chrome (via wine), and they all worked (on Linux).
3. Like Philip Peterson pointed out, createTextNode() converts HTML to text. I still think that innerHTML() is better because it actually works (and it's fast). Though it might not be practical for this project, you could use the innerDOM script from http://innerdom.sourceforge.net/ to achieve the same effect as innerHTML() and adhere to "standards."
#10. Kevin on 03 November 2008
We track the 'unported' functions in SVN, which can also be viewed here:
http://trac.plutonia.nl/projects/phpjs/browser/trunk/_unported
... [more] Everytime we create a new function it's moved from ./_unported to ./functions
I'll be looking forward to seeing some of your excellent work again. And your english i fine btw ;) ciao!
#9. waldo malqui silva on 29 October 2008
1.- Change mi nick (_argos) by my real name (Waldo Malqui Silva) :p
2.- If you have a TODO list of functions to port.
... [more]
I'm happy to back and see more functions that in my last visit. I promise practice more my english :p
PD: I'm working in a customizable download for the project like mootools 1.11 (packages¿?) based on the PHP functions group :p
#8. Kevin on 20 October 2008
#7. Philip Peterson on 18 October 2008
#6. Philip Peterson on 18 October 2008
[CODE]
document.appendChild(elmt);
[/CODE]
the script breaks, because it should be (for Firefox at least)
[CODE]
body.appendChild(elmt);
[/CODE]
#5. Philip Peterson on 14 October 2008
var docFragment = document.createDocumentFragment();
var txt = document.createTextNode("my text node");
docFragment.appendChild(txt);
... [more]
I guess probably something like that? (note that I am not "echo is bad".)
Perhaps there should be an alias print() which would take one argument? It may also be useful to handle \b things (I think php does this, but I'm not sure), which could be accomplished by inserting some text that appears nowhere else in the document (like [COD_92993] or something) and then modify the .innerHTML of the body by removing that [COD_92993] plus as many characters as there are \b's.
#4. Kevin on 17 April 2008
- this is what the code Should look like?
- your name to include in the comment
#3. echo is bad on 16 April 2008
I strongly recommend you to use document.createDocumentFragment.
#2. Kevin on 15 April 2008
#1. Philip Peterson on 15 April 2008