Building off of @nowox's answer, I've added macro definitions that allow the key values to be used within the environment.
\documentclass{article}
\usepackage{keyval}
\makeatletter
\define@key{myenv@keys}{foo}{\def\myenv@foo{#1}}%
\define@key{myenv@keys}{bar}{\def\myenv@bar{#1}}%
\newenvironment{myenv}[1][]{%
% \makeatletter
\setkeys{myenv@keys}{foo=default foo,% Set default value for foo
bar=default bar,% Set default value for bar
#1}% Set values given in environment argument.
\def\foo{\myenv@foo}% Define \foo as the value given.
\def\bar{\myenv@bar}% Probably a bad idea to redefine \bar, but done for sake of demo.
In environment preamble: foo=``\foo'', bar=``\bar.''\par
}{
\par\bigskip
}
\makeatother
\begin{document}
\makeatother
\begin{myenv}[foo=hello]
% Within the environment, \foo and \bar can used.
In environment (1): \verb|\foo|=\foo'', \verb|\bar|=\bar.''
\end{myenv}
\begin{myenv}[bar=goodbye]
In environment (2): \verb|\foo|=\foo'', \verb|\bar|=\bar.''
\end{myenv}
Outside the \verb|myenv| environment, \verb|\foo| is undefined
and \verb|\bar| retains its original definition meaning,
e.g., \verb|\bar{A}=|$\bar{A}$.
\end{document}
Output:
